高效初始化Cython Memoryview



我当前正在Cython pyx文件中设置MemoryView,如下所示:

@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?

有关不同内存分配方式的比较,请参阅此答案。如果您的需求很简单(只是索引),请特别注意"cpython.array原始C类型",您可以创建一个cpython数组进行快速创建,然后使用as_ints[i]进行快速不安全索引,或者如果您确实需要内存视图,则cpython阵列上的内存视图比numpy数组快3倍。

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

您的内存视图很慢(不是严格必要的),因为Python需要引用-计算它。您可以使用Python/C API手动分配内存,但当您不再需要时,您有责任释放它。

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

相关内容

  • 没有找到相关文章

最新更新