有效初始化Cython Memoryview

2024-09-29 19:25:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我当前正在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_loop():
    for i in range(10000):
        fill_memview()

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

我怎样才能更好地安装我的打字记忆视图?在


Tags: 文件inloopfornprangefillcython
2条回答

因为Python需要引用count它,所以memoryview很慢(比严格需要的要慢)。您可以allocate the memory by hand使用Python/capi,但是当您不再需要它时,您需要负责释放它。在

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

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

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

相关问题 更多 >

    热门问题