4

我目前MemoryView在我的 Cythonpyx文件中设置我的 s 如下:

@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()

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

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

4

2 回答 2

3

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

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

于 2014-11-10T22:07:23.447 回答
1

您的 memoryview 很慢(比严格必要的要慢),因为 Python 需要对其进行引用计数。您可以使用 Python/C API手动分配内存,但是当您不再需要它时,您需要负责释放它。

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

于 2014-11-10T14:45:52.900 回答