2017-02-10 64 views
2

我試圖比較使用基本示例的numba和純python,並且得到了奇怪的結果。Numba比純python慢​​的基本示例

這是numba例如:

from numba import jit 
from numpy import arange 
from time import time 
# jit decorator tells Numba to compile this function. 
# The argument types will be inferred by Numba when function is called. 
@jit 
def sum2d(arr): 
    M, N = arr.shape 
    result = 0.0 
    for i in range(M): 
     for j in range(N): 
      result += arr[i,j] 
    return result 

a = arange(9).reshape(3,3) 
t = time() 
print(sum2d(a)) 
print time() - t 

這是我得到與numba0.0469660758972秒

而且沒有numba時機我得到更快的結果9.60826873779e-05秒

+0

這是一個非常小的例子。你如何計時? –

+0

@terencehill感謝您的快速回復。我編輯了我的原始文章 – msgb

+1

您可能花費大部分時間編譯 – user357269

回答

3

需要根據參數的類型來編譯您的函數,您可以通過提供簽名(eager compilation)來定義函數時執行此操作,或者您可以讓numba在您調用函數第一次(它被稱爲即時(JIT)編譯畢竟:-))。

您尚未指定任何簽名,因此在第一次調用它時會推斷並編譯該函數。他們even state that在你使用的示例:

# jit decorator tells Numba to compile this function. 
# The argument types will be inferred by Numba when function is called. 

但是後續運行(與同類型和dtypes)將是快速:

t = time() 
print(sum2d(a)) # 0.035051584243774414 
print(time() - t) 

%timeit sum2d(a) # 1000000 loops, best of 3: 1.57 µs per loop 

的最後一個命令使用IPythons%timeit command

+0

TLDR;需要注意的是使用魔法單元格'%% timeit'來再次運行單元格,並在每次調用時都讓numba推斷出類型。對函數進行預調用使用行魔法單元格'%timeit'更好 – MCMZL