我目前正在我的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?
答案 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,但是当您不再需要它时,您将负责释放它。
除非您使用了分析器并且看到了不可接受的引用计数开销,否则不要这样做。过早优化从来都不是一个好主意,使用这种方法很容易引入内存泄漏或段错误。