高效初始化Cython Memoryview

4

我目前在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调用,导致速度变慢)。如何更好地实例化我的类型化内存视图?
2个回答

3
请参阅此答案,了解不同的内存分配方式的比较。如果您的需求很简单(只是索引),请特别注意“cpython.array原始C类型”,您可以创建一个cpython数组以进行快速创建,然后使用as_ints [i]进行快速且不安全的索引;或者,如果您真的需要内存视图,则在cpython数组上的内存视图比numpy数组快3倍。
没有更多关于代码背景的信息,很难提供更具体的建议。例如,如果可能的话,使用二维数组将更为高效,因为一次性分配一个大块内存要比分配许多小块内存更快,例如,使用一个大的已分配内存的内存视图片段来制作许多小的内存视图片段比创建许多带有自己小内存块的小内存视图更快。

1
你的memoryview速度较慢(比严格必要的还要慢)是因为Python需要引用计数。你可以使用Python/C API手动分配内存, 但这样,当你不再需要它时,你需要负责释放它。

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


你能解释一下“过早优化”是什么意思吗? - LondonRob
你正在尝试加快代码速度,但在使用分析工具测量性能之前,你不知道它正在执行这段代码所花费的时间。它恰好出现在紧密循环中可能意味着它会,但如果没有经验数据,很难确定。也许 O(1) 的 Python 开销被 O(n) 的初始化(即 x[i] = i 行)所主导。 - Kevin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接