2014-11-16 23 views
2

我試圖通過嘗試幾個簡單的算法來理解jumb/vectorize在numbapro背後的語義。這是米勒拉賓素性測試,我想隨後運行多次。Numbapro試圖向量化jit'd函數

這工作得很好

from numbapro import jit , guvectorize , vectorize, uint64, int32, int8, bool_ 
import random 
@jit(bool_(uint64,int32),target='cpu') 
def is_prime(n,k): 
    if n % 2 == 0: 
     return False 
    # n-1 as 2^s * d 
    dn = n - 1 
    s1 = 0 
    while dn % 2 == 0: 
     dn = dn >> 1 
     s1 += 1 
    for j in range(k): 
     a1 = random.randint(2,n-2) 
     x = pow(a1,dn) % n 
     if x == 1 or x == n - 1: 
      continue 
     for i in range(s1): 
      x = (x * x) % n 
      if x == 1: 
       return False 
      if x == n - 1: 
       break 
    return True 

但隨着

@vectorize(bool_(uint64,int32),target='cpu') 

更換裝飾給人

Traceback (most recent call last): 
    File "h:\users\mushfaque.cradle\documents\visual studio 2013\Projects\EulerPraxis\EulerPraxis\EulerPraxis.py", line 12, in <module> 
    @vectorize(int8(uint64,int32),target='cpu') 
    File "H:\Apps\Anaconda3\lib\site-packages\numba\npyufunc\decorators.py", line 67, in wrap 
    for fty in ftylist: 
TypeError: 'NotImplementedType' object is not callable 

據我所知,矢量化應該ufuncs使用,但我是什麼錯誤錯過使這個ufunc?

回答

0

我解決了這個問題。

  • @vectorize([int32(uint64,int32)],target ='cpu')修復了第一個問題。 請注意類型註釋周圍的'[]'
  • bool_作爲返回類型不被支持(bug)已被報告。同時使用int32
  • 更微妙的問題是,如果您使用n = 3,randint會引發異常。 Numba不處理代碼中的例外情況,所以應該有一個額外的'如果'來捕捉這種可能性