Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Cython-从输入声明列表_Python_C_Cython_Cythonize - Fatal编程技术网

Python Cython-从输入声明列表

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

我试图使用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对象的C数组——这实际上不起作用,因为C数组不容易与Python对象引用计数集成(在这种情况下,当您返回整个数组时,您需要将其复制到其他对象,因为它是一个局部变量,只作用于函数)

  • 对于形式为
    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
    指针,然后您可以填充这些指针