Python Cython-从输入声明列表
我试图使用cython将对象列表(GeoJSON)转换为shapely对象,但遇到了一个错误: 这段代码似乎就是问题所在:Python Cython-从输入声明列表,python,c,cython,cythonize,Python,C,Cython,Cythonize,我试图使用cython将对象列表(GeoJSON)转换为shapely对象,但遇到了一个错误: 这段代码似乎就是问题所在:cdef对象结果[N]。如何从给定的列表中声明列表/数组 这是我目前的代码: def convert_geoms(列表数组): cdef int i,N=len(数组) cdef双x,s=0.0 cdef对象结果[N]#此处出错 对于范围(N)中的i: g=构建几何体对象2(数组[i]) 结果[i]=g 返回结果 cdef对象结果[N]有两个问题。: 它创建了一个Python
cdef对象结果[N]
。如何从给定的列表中声明列表/数组
这是我目前的代码:
def convert_geoms(列表数组):
cdef int i,N=len(数组)
cdef双x,s=0.0
cdef对象结果[N]#此处出错
对于范围(N)中的i:
g=构建几何体对象2(数组[i])
结果[i]=g
返回结果
cdef对象结果[N]有两个问题。
:
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.list
调用它。请参阅类似的示例,其中列表创建是以这种方式优化的。PyList\u New
的优点是,它在一开始就创建了一个大小合适的列表,列表中填充了NULL
指针,然后您可以填充这些指针