2016-04-13 103 views
1

我有一個公共的筆記本,其中蟒蛇,numpy的,numba,用Cython和Fortran是在簡單相加比較:爲什麼numba在這個簡單的總結上這麼快?

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

爲什麼numba如此之快?

+0

因爲你在一個值上運行numba,而在數組上運行其他值。 – DavidW

+0

'%timeit sumr(int(1e6))'(line 7) – DavidW

+0

@DavidW:'sumr'內有一個使用'range'的循環。 – BrenBarn

回答

3

正如@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 

我不會從這樣的微基準中得出太多結論,但至少現在正在比較等效的實現。

相關問題