Python 有效初始化Cython Memoryview
我目前正在CythonPython 有效初始化Cython Memoryview,python,cython,memoryview,Python,Cython,Memoryview,我目前正在Cythonpyx文件中设置我的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
pyx
文件中设置我的MemoryView
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()
当我使用cython-a foo.pyx
编译pyx
文件时,cdef int[:]x=np.empty(10)
行显示在结果的带注释的html
文件中,显示为深黄色(这意味着它有大量的Python调用减慢了速度)
如何更好地恢复键入的Memoryview?您的Memoryview很慢(比严格要求的慢),因为Python需要引用它。您可以使用Python/capi,但是当您不再需要它时,您需要负责释放它
不要这样做,除非您使用了探查器,并且看到了不可接受的引用计数开销。过早优化从来都不是一个好主意,使用这种方法很容易导致内存泄漏或SEGFULT。有关分配内存的不同方法的比较,请参阅。如果您的需要很简单(只是索引),请特别注意“cpython.array raw C type”,您可以创建一个cpython数组以进行快速创建,然后使用as_ints[i]
进行快速不安全索引,或者如果您确实需要内存视图,则cpython数组上的内存视图比numpy数组快3倍
如果没有更全面地了解代码的功能,就很难提供更具体的建议。例如,如果可能的话,使用二维数组会更好,因为分配一大块内存比分配许多小块内存更有效,例如,用一大块已分配内存制作一个大内存视图的许多小内存视图切片要快得多,而不是创建一堆小内存视图,每个视图都有自己的一小块分配内存。你能解释一下“过早优化”是什么意思吗?你试图让你的代码更快,但在你用分析器衡量性能之前,你不知道执行这段代码花了很多时间。事实上,它恰好处于一个紧密的循环中,这意味着它可能是,但如果没有经验数据,就很难确定。也许O(1)Python开销主要由O(n)初始化控制(即
x[i]=i
行)。