首页 > 解决方案 > 将列表传递给 cython 函数并返回一个列表

问题描述

我是 cython 的新手,我在谷歌上搜索了几个小时。我想将一个整数列表传递给一个 cython 函数,进行一些计算并返回一个列表。

像这样的东西:

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 数组作为参数传递。

最后调用如下函数:

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

错误:

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

提前感谢您的任何指导。

标签: pythoncython

解决方案


这是一个稍微修改的示例:

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


推荐阅读