python - 将列表传递给 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
提前感谢您的任何指导。
解决方案
这是一个稍微修改的示例:
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
推荐阅读
- jmeter - Jmeter负载测试-运行测试时每个线程的互联网速度是多少
- android - 具有依赖关系的 Android 库无法正确解析
- python - 将熊猫数据框转换为系列数组
- excel - VBA - 替换pdf文件中出现的字符串
- c# - 通过 Socks4/5 代理 .NET
- javascript - 无法实现身份验证路由
- javascript - 如何在 Ionic/Angular 应用程序中使用 stripe.js
- javascript - 如何将两个javascript数组合并为一个并按日期分组
- python-3.x - 如何在二进制中忽略 \n 直到出现实际的新行标记
- node.js - 快速会话。会话不持久