有效地初始化Cython Memoryview

时间:2014-11-10 12:10:48

标签: python cython memoryview

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

@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文件时,行cdef int[:] x = np.empty(10)中显示的行显示为深黄色的html文件(意味着它有大量的Python调用会减慢速度下来。)

如何更好地设置我的类型化Memoryview?

2 个答案:

答案 0 :(得分:3)

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

如果没有更好地了解您的代码所做的事情,那么很难提供更具体的建议。例如,如果可能的话,使用二维数组可以更好地服务,因为分配一大块内存往往比许多小内存更有效,例如它可以更快地制作大量的内存。小内存视图一个大内存视图的片段,分配内存的大块,而不是创建一堆小内存视图,每个内存视图都有自己的小块内存。

答案 1 :(得分:1)

你的记忆视图很慢(严格要求)因为Python需要引用计数它。您可以allocate the memory by hand使用Python / C API,但是当您不再需要它时,您将负责释放它。

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