如何在 Cython 中定义列表

Mic*_*ang 10 arrays list cython python-3.x

我想将以下python代码转换为Cython

x_array = []

x_array.append(x_new)
Run Code Online (Sandbox Code Playgroud)

我尝试了以下 Cython 代码,但它给出了错误:

cdef np.ndarray[double, dim=1] x_array

x_array.append(x_new)
Run Code Online (Sandbox Code Playgroud)

错误显示:

Cannot coerce list to type [double, dim=1]

Dav*_*idW 15

您的选择是:

  1. cdef list x_array. 这让 Cython 知道类型x_array实际上是一个列表。您可能会从中获得小幅加速。

  2. x_array一个numpy的阵列来代替。如果列表中的所有元素都是相同的简单数字类型,那么这可能是更好的选择。请注意,append使用 numpy 数组可能会非常慢,因此您应该提前计算大小。

    cdef np.array[double, dim=1] x_array = np.zeros((some_precomputed_size,))
    # or
    cdef double[:] x_array = np.zeros((some_precomputed_size,))
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,这只会加快某些类型的操作(主要是访问 Cython 中的单个元素)

  3. 如果您开始使用 Python ,list有时可以通过 Cython 中的 Python C API 访问它们来提高速度。这个答案提供了一个很好的例子。这在您事先知道大小时效果最好,因此您可以预先分配数组(即不要append!)并避免一些 Cython 引用计数。使用这种方法很容易出错并导致引用计数错误,因此请谨慎操作。