gpt4 book ai didi

python - Cython - 从输入声明列表

转载 作者:行者123 更新时间:2023-11-30 16:11:25 24 4
gpt4 key购买 nike

我正在尝试使用 cython 将对象列表 (GeoJSON) 转换为形状对象,但遇到错误:

这段代码似乎是问题所在:cdef object result[N]。如何从给定的列表声明列表/数组?

这是我当前的代码:

def  convert_geoms(list array):
cdef int i, N=len(array)
cdef double x, s=0.0
cdef object result[N] # ERROR HERE
for i in range(N):
g = build_geometry_objects2(array[i])
result[i] = g
return result

最佳答案

cdef object result[N] 存在两个问题:

  1. 它创建了一个 Python 对象的 C 数组 - 这实际上不起作用,因为 C 数组不容易与 Python 对象引用计数集成(在这种情况下,您需要将整个数组复制到其他东西)无论如何,当您返回它时,因为它是一个局部变量,其作用域仅限于该函数)。

  2. 对于 sometype result[N] 形式的 C 数组,N 必须在编译时已知。在这种情况下,N 对于每个函数调用都是不同的,因此变量定义无论如何都是无效的。

<小时/>

有多种解决方案 - 其中大多数只涉及接受您正在使用 Python 对象,因此不必担心指定类型,只需编写有效的 Python 代码即可。我可能会把它写成列表理解。我怀疑 Cython 在为此生成优化代码方面会做得非常好

return [ build_geometry_objects2(array[i]) for i in range(len(array)) ]
# or
return [ build_geometry_objects2(a) for a in array ]

第二个版本可能更好,但如果重要的话你可以计时。

如果性能确实很重要,您可以使用 Python C API 调用,您可以从 cpython.listcimport。请参阅Cythonize list of all splits of a string举一个类似的例子,其中列表创建是通过这种方式优化的。 PyList_New 的优点是它在开头创建一个适当大小的列表,并填充 NULL 指针,然后您可以填充该列表。

关于python - Cython - 从输入声明列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58608114/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com