python - 为什么 numba 在这个简单的求和上要快得多?

标签 python numpy cython numba f2py

我有一个公共(public)笔记本,其中对 python、numpy、numba、cython 和 fortran 进行简单求和比较:

https://gist.github.com/denfromufa/7727874c4fe1e7e174ed953930e93bbc

为什么 numba 速度这么快?

最佳答案

正如@DavidW 所指出的,您并没有真正对相同的算法进行比较。下面我为每个 cython 和 numba 编写了两个独立的函数,它们执行相同的操作。第一个对数组进行操作,第二个仅给出一个整数:

赛通:

cpdef long cy_sum(long[:] A):
    cdef long i, n = A.shape[0], s = 0
    for i in range(n):
        s += A[i]
    return s

cpdef long cy_sum2(long i):
    cdef long s, x
    s = 0
    for x in range(i):
        s += x
    return s

努巴:

@nb.jit(nopython=True)
def nb_sum(A):
    s=0
    n = A.shape[0]
    for i in range(n):
        s += A[i]
    return s

@nb.jit(nopython=True)
def nb_sum2(i):
    s=0
    for x in range(i):
        s+=x
    return s

测试以确保它们给出相同的结果:

N = int(1e6)
d = np.arange(N, dtype=np.int64)

print np.allclose(nb_sum(d), cy_sum(d))   # True
print np.allclose(nb_sum2(N), cy_sum2(N))  # True

以及我的硬件上的计时:

%timeit cy_sum(d)
%timeit nb_sum(d)

1000 loops, best of 3: 416 µs per loop
1000 loops, best of 3: 237 µs per loop

%timeit cy_sum2(N)
%timeit nb_sum2(N)

10000000 loops, best of 3: 63.5 ns per loop
10000000 loops, best of 3: 187 ns per loop

我不会从这样的微基准中得出太多结论,但至少现在正在比较等效的实现。

关于python - 为什么 numba 在这个简单的求和上要快得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36589998/

相关文章:

python - Pandas 打印所有 dtypes

python - Numpy 查找匹配列的索引

linux - 使用cython将多个python模块构建成一个程序

numpy - 在cython定义的c函数中返回numpy数组

python - 如何使用 Kameleo 和 Selenium 加载多个 chrome 浏览器?

python - 将值设置为 pandas 数据框的整列

python - 导入错误 : cannot import name 'Account' from 'O365' using Office 365 Project

python - PIL 图像转换为 RGB,保存为纯黑色图像(python)

python - 添加数字时 python/numpy 中的浮点精度分解

python - Cython 扩展类 : How do I expose methods in the auto-generated C struct?