【问题标题】:Initialise Cython Memoryview efficiently有效地初始化 Cython Memoryview
【发布时间】:2015-01-06 17:47:16
【问题描述】:

我目前在我的 Cython pyx 文件中设置我的 MemoryViews,如下所示:

@cython.boundscheck(False)
cdef int[:] fill_memview():
    # This happens inside a big loop so needs to be fast
    cdef int[:] x = np.empty(10)
    for i in range(10):
        x[i] = i
    return x

cdef stupid_loop():
    for i in range(10000):
        fill_memview()

当我用cython -a foo.pyx 编译pyx 文件时,cdef int[:] x = np.empty(10) 行在生成的带注释的html 文件中显示为深黄色(这意味着它有很多 Python 调用会减慢速度。)

如何更好地实例化我键入的 Memoryview?

【问题讨论】:

    标签: python cython memoryview


    【解决方案1】:

    请参阅this answer 以比较不同的内存分配方式。如果您的需求很简单(只是索引),请特别注意“cpython.array raw C type”,您可以创建一个 cpython 数组以快速创建,然后使用as_ints[i] 进行快速不安全索引,或者如果您确实需要内存视图,cpython 数组上的内存视图比 numpy 数组快 3 倍。

    如果对代码的作用没有更全面的了解,就很难提供更具体的建议。例如,如果可能的话,使用二维数组会更好,因为分配一大块内存往往比分配很多小块更有效,例如,制作大量小内存视图切片要快得多一个大内存视图和一大块分配的内存,而不是创建一堆小内存视图,每个视图都有自己的一小块分配的内存。

    【讨论】:

      【解决方案2】:

      你的 memoryview 很慢(比严格必要的),因为 Python 需要对其进行引用计数。您可以使用 Python/C API allocate the memory by hand,但是当您不再需要它时,您有责任释放它。

      除非您使用了分析器并且看到无法接受的引用计数开销,否则不要这样做。过早的优化从来都不是一个好主意,而且这种方法很容易引入内存泄漏或段错误。

      【讨论】:

      • 你能解释一下“过早优化”是什么意思吗?
      • 您正在尝试使您的代码更快,但在您使用分析器测量性能之前,您不知道它花费了很多时间来执行此代码。事实上,它恰好处于一个紧密的循环中,这意味着它可能,但如果没有经验数据,很难确定。也许 O(1) Python 开销主要由 O(n) 初始化(即x[i] = i 行)支配。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      • 2019-05-18
      • 2020-05-27
      • 2012-09-29
      • 1970-01-01
      相关资源
      最近更新 更多