2017-07-18 119 views
2

所以我需要改善我一直在努力的腳本的執行時間。我開始與numba JIT裝飾工作,試圖並行計算然而它拋出我numba @jit慢了一點,純粹的python?

KeyError: "Does not support option: 'parallel'" 

,所以我決定測試nogil如果解除從我的CPU整體的能力,但它比純Python我不明白爲什麼這個慢事情發生了,如果有人可以幫助我,或指引,我將非常感激

import numpy as np 
from numba import * 
@jit(['float64[:,:],float64[:,:]'],'(n,m),(n,m)->(n,m)',nogil=True) 
def asd(x,y): 
    return x+y 
u=np.random.random(100) 
w=np.random.random(100) 

%timeit asd(u,w) 
%timeit u+w 

10000圈,最好的3:每循環 137微秒最慢的運行速度比最快的耗時較長7.13倍。這可能意味着正在緩存中間結果 1000000個循環,最好爲3:每個循環1.75μs

回答

3

您不能指望numba在這種簡單的矢量化操作上勝過numpy。由於numba函數包含外部函數調用的成本,因此您的比較並不完全公平。如果總結更大的陣列,你會發現兩者的性能匯聚,哪些是你所看到的僅僅是在一個非常快的操作開銷:

import numpy as np 
import numba as nb 

@nb.njit 
def asd(x,y): 
    return x+y 

def asd2(x, y): 
    return x + y 

u=np.random.random(10000) 
w=np.random.random(10000) 

%timeit asd(u,w) 
%timeit asd2(u,w) 

The slowest run took 17796.43 times longer than the fastest. This could mean 
that an intermediate result is being cached. 
100000 loops, best of 3: 6.06 µs per loop 

The slowest run took 29.94 times longer than the fastest. This could mean that 
an intermediate result is being cached. 
100000 loops, best of 3: 5.11 µs per loop 

至於並行功能,對於這個簡單的操作,再次

@nb.vectorize([nb.float64(nb.float64, nb.float64)], target='parallel') 
def asd3(x, y): 
    return x + y 

u=np.random.random((100000, 10)) 
w=np.random.random((100000, 10)) 

%timeit asd(u,w) 
%timeit asd2(u,w) 
%timeit asd3(u,w) 

但是,如果你在小數組操作,你將要看到線程分派的開銷:您可以使用nb.vectorize。對於上面的數組大小,我看到並行給我一個2x加速。

凡numba真正的閃光點是這樣做很難用廣播在numpy的做,或者在操作會導致大量的臨時中間陣列分配的操作。

+0

嗨@JoshAdel感謝您的回答,我真正的代碼是algorith所以它遍歷相同的功能,檢查改進,所以我不知道如果優化的aguments值的不斷變化和嵌套函數量如果我矢量化執行最多的函數將會是一個問題。再次感謝你 – jmparejaz