【问题标题】:how to define a list in Cython如何在 Cython 中定义一个列表
【发布时间】:2018-10-14 17:22:42
【问题描述】:

我想将下面的python代码转换成Cython

x_array = []

x_array.append(x_new)

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

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

x_array.append(x_new)

错误显示:

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

【问题讨论】:

  • 欢迎堆栈溢出。当询问有关由您的代码引起的问题的问题时,如果您提供人们可以用来重现问题的代码,您将获得更好的答案。请阅读如何提供Minimal, Complete, and Verifiable example
  • 你输入的是一个 numpy 数组而不是一个列表。尝试修复内置 Python 对象的类型(例如 list)并没有真正的优势
  • 有没有办法解决这个问题?我的 python 代码中有很多列表对象。有没有办法使用 Cython 来提高性能?

标签: arrays python-3.x list cython


【解决方案1】:

您的选择是:

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

  2. x_array 改为一个 numpy 数组。如果列表中的所有元素都是相同的简单数字类型,那么这可能是一个更好的选择。请注意 appending 到 numpy 数组可能会很慢,因此您应该提前计算大小。

    cdef np.array[double, dim=1] x_array = np.zeros((some_precomputed_size,))
    # or
    cdef double[:] x_array = np.zeros((some_precomputed_size,))
    

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-28
    • 2014-07-05
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多