मैं साइथन के लिए नया हूं और मैं घंटों तक गुगली कर रहा हूं। मैं एक सूची पास करना चाहता हूं उदा। एक साइथन फ़ंक्शन के पूर्णांक, कुछ गणना करें और एक सूची लौटाएं।

कुछ इस तरह:

cimport libc.stdlib as lib 

def do_calc(list_a):
    cdef size_t n = len(list_a)
    cdef int* data = <int*>lib.malloc(n * sizeof(int))
    cdef int i 

    for i in range(n):
        data[i] = 2 * list_a[i]

    return data

मैं तर्क के रूप में numpy array पास नहीं करने जा रहा हूं।

अंत में फ़ंक्शन को कॉल करें जैसे:

import example_cy
a = [1, 2, 3]
print(example_cy.do_calc(a))

त्रुटि:

example_cy.pyx:11:11: Cannot convert 'int *' to Python object

किसी भी गाइड के लिए अग्रिम धन्यवाद।

0
Abolfazl 27 अप्रैल 2020, 12:54

1 उत्तर

सबसे बढ़िया उत्तर

यहां थोड़ा संशोधित उदाहरण दिया गया है:

cimport libc.stdlib as lib 

def do_calc(list_a):
    cdef size_t n = len(list_a)
    # `data` declaration changed from `int* data`
    cdef int *data = <int *> lib.malloc(n * sizeof(int))
    cdef int i
    try:
        for i in range(n):
            data[i] = 2 * list_a[i]
        # pack C values back to python int objects
        return [x for x in data[:n]]
    finally:
        # don't forget to fee allocated memory
        lib.free(data)

आप आधिकारिक डॉक्स में अधिक स्पष्टीकरण पढ़ सकते हैं: https://cython। readthedocs.io/en/latest/src/tutorial/memory_allocation.html

0
Andrey Khoronko 27 अप्रैल 2020, 13:14