python - 为什么 Cython 比向量化的 NumPy 慢?

标签 python arrays performance numpy cython

考虑以下 Cython 代码:

cimport cython
cimport numpy as np
import numpy as np

@cython.boundscheck(False)
@cython.wraparound(False)
def test_memoryview(double[:] a, double[:] b):
    cdef int i
    for i in range(a.shape[0]):
        a[i] += b[i]

@cython.boundscheck(False)
@cython.wraparound(False)
def test_numpy(np.ndarray[double, ndim=1] a, np.ndarray[double, ndim=1] b):
    cdef int i
    for i in range(a.shape[0]):
        a[i] += b[i]

def test_numpyvec(a, b):
    a += b

def gendata(nb=40000000):
    a = np.random.random(nb)
    b = np.random.random(nb)
    return a, b

在解释器中运行它会产生(经过几次运行以预热缓存):

In [14]: %timeit -n 100 test_memoryview(a, b)
100 loops, best of 3: 148 ms per loop

In [15]: %timeit -n 100 test_numpy(a, b)
100 loops, best of 3: 159 ms per loop

In [16]: %timeit -n 100 test_numpyvec(a, b)
100 loops, best of 3: 124 ms per loop

# See answer below :
In [17]: %timeit -n 100 test_raw_pointers(a, b)
100 loops, best of 3: 129 ms per loop

我用不同的数据集大小进行了尝试,并且始终使矢量化 NumPy 函数运行得比编译的 Cython 代码快,同时我希望 Cython 在性能方面与矢量化 NumPy 不相上下。

我是否忘记了我的 Cython 代码中的优化? NumPy 是否使用某些东西(BLAS?)来使这种简单的操作运行得更快?我可以提高这段代码的性能吗?

更新:原始指针版本似乎与 NumPy 相当。因此,显然在使用内存 View 或 NumPy 索引时存在一些开销。

最佳答案

另一种选择是使用原始指针(和全局指令以避免重复 @cython...):

#cython: wraparound=False
#cython: boundscheck=False
#cython: nonecheck=False

#...

cdef ctest_raw_pointers(int n, double *a, double *b):
    cdef int i
    for i in range(n):
        a[i] += b[i]

def test_raw_pointers(np.ndarray[double, ndim=1] a, np.ndarray[double, ndim=1] b):
    ctest_raw_pointers(a.shape[0], &a[0], &b[0])

关于python - 为什么 Cython 比向量化的 NumPy 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24308236/

相关文章:

java - 2D Array(Double) 排序给出 0 个值

java - 编写一个接受数组并仅返回正数的函数

javascript - 向元素添加事件监听器的最佳方式

jquery - 如果 jQuery 脚本是在所有页面 HTML 之后加载的,那么它们还需要 $(document).ready 吗?

python - 网站开发的设置过程是怎样的?

python - 使用 python 从 linux 连接到 MS SQL Server 的最佳技术是什么?外接程序?

arrays - 为什么禁止内置 "braced-init-list"中的 "operator[]"?

performance - Julia:稀疏矩阵的 View

python - 网络爬虫的速度不能超过约1MB/秒

python - How to convert loop to list comprehension in Python - 特定难题