1
我有一個公共的筆記本,其中蟒蛇,numpy的,numba,用Cython和Fortran是在簡單相加比較:爲什麼numba在這個簡單的總結上這麼快?
https://gist.github.com/denfromufa/7727874c4fe1e7e174ed953930e93bbc
爲什麼numba如此之快?
我有一個公共的筆記本,其中蟒蛇,numpy的,numba,用Cython和Fortran是在簡單相加比較:爲什麼numba在這個簡單的總結上這麼快?
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
我不會從這樣的微基準中得出太多結論,但至少現在正在比較等效的實現。
因爲你在一個值上運行numba,而在數組上運行其他值。 – DavidW
'%timeit sumr(int(1e6))'(line 7) – DavidW
@DavidW:'sumr'內有一個使用'range'的循環。 – BrenBarn