![](/img/trans.png)
[英]Why is a simple in-place addition much faster with numba than numpy?
[英]why is numba so much faster on this simple summation?
我有一個公共筆記本,其中python,numpy,numba,cython和fortran在簡單求和上進行比較:
https://gist.github.com/denfromufa/7727874c4fe1e7e174ed953930e93bbc
為什么numba這么快?
正如@DavidW指出的那樣,你並沒有真正對相同算法進行比較。 下面我為每個cython和numba編寫了兩個單獨的函數來執行相同的操作。 第一個是在一個數組上運行,第二個是給定一個整數:
用Cython:
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
Numba:
@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
我不會從這樣的微基准中得出太多結論,但至少現在正在比較等效的實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.