2016-05-12 74 views
1

我正在從Python2.7 numba代碼轉換到Python3.4。該函數pairwise_distance將距離矩陣轉換爲多維數組XYNumba KeyError與Python3.4,`KeyError:「不支持選項:'arg_types''`

不過,我使用的是numba裝飾@jit以加快代碼:

import numpy as np 
from numba import double 
from numba.decorators import jit 

@jit(arg_types = [double[:,:], double[:,:]]) 
def pairwise_distance(X, D): 
    M = X.shape[0] 
    N = X.shape[1] 
    for i in range(M): 
     for j in range(M): 
      d = 0.0 
      for k in range(N): 
       tmp = X[i, k] - X[j, k] 
       d += tmp * tmp 
      D[i, j] = np.sqrt(d) 

# calculate the pairwise distance between X and Y 

X = np.random.random((1000, 3)) 
Y = np.empty((1000, 1000)) 
pairwise_distance(X, Y) 

它輸出以下錯誤:

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

我不能完全肯定這個錯誤是什麼意思,或者如何一個將Python2.7翻譯爲與Python3.4兼容

這是完整的錯誤:

--------------------------------------------------------------------------- 
KeyError         Traceback (most recent call last) 
/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/numba/targets/options.py in from_dict(self, dic) 
    15    try: 
---> 16     ctor = self.OPTIONS[k] 
    17    except KeyError: 

KeyError: 'arg_types' 

During handling of the above exception, another exception occurred: 

KeyError         Traceback (most recent call last) 
<ipython-input-15-2c486d04f659> in <module>() 
    19 X = np.random.random((1000, 3)) 
    20 Y = np.empty((1000, 1000)) 
---> 21 pairwise_numba(X, Y) 

/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/numba/dispatcher.py in _compile_for_args(self, *args, **kws) 
    286    else: 
    287     real_args.append(self.typeof_pyval(a)) 
--> 288   return self.compile(tuple(real_args)) 
    289 
    290  def inspect_llvm(self, signature=None): 

/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/numba/dispatcher.py in compile(self, sig) 
    504 
    505    self._cache_misses[sig] += 1 
--> 506    cres = self._compiler.compile(args, return_type) 
    507    self.add_overload(cres) 
    508    self._cache.save_overload(sig, cres) 

/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/numba/dispatcher.py in compile(self, args, return_type) 
    76  def compile(self, args, return_type): 
    77   flags = compiler.Flags() 
---> 78   self.targetdescr.options.parse_as_flags(flags, self.targetoptions) 
    79 
    80   impl = self._get_implementation(args, {}) 

/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/numba/targets/options.py in parse_as_flags(cls, flags, options) 
    24  def parse_as_flags(cls, flags, options): 
    25   opt = cls() 
---> 26   opt.from_dict(options) 
    27   opt.set_flags(flags) 
    28   return flags 

/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/numba/targets/options.py in from_dict(self, dic) 
    17    except KeyError: 
    18     fmt = "Does not support option: '%s'" 
---> 19     raise KeyError(fmt % k) 
    20    else: 
    21     self.values[k] = ctor(v) 

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

回答

1

當我使用argtypes代替arg_types,而不是得到一個KeyError的,我得到一個棄用警告說,使用signature代替。

下使用python 3.5和numba 0.25.0

import numpy as np 
from numba import jit 

@jit('void(double[:,:], double[:,:])') 
def pairwise_distance(X, D): 
    M = X.shape[0] 
    N = X.shape[1] 
    for i in range(M): 
     for j in range(M): 
      d = 0.0 
      for k in range(N): 
       tmp = X[i, k] - X[j, k] 
       d += tmp * tmp 
      D[i, j] = np.sqrt(d) 

# calculate the pairwise distance between X and Y 

X = np.random.random((1000, 3)) 
Y = np.empty((1000, 1000)) 
pairwise_distance(X, Y) 
+0

你能解釋一下爲什麼你正在使用的不是「argtypes」「空」爲我工作? – ShanZhengYang

+0

你的函數不返回任何東西,所以'void'是返回類型。 'argtypes'已棄用。事實上,我的建議是隻使用'@ jit'或'@jit(nopython = True)''''''njit'並讓numba對輸入和輸出類型進行類型推斷。 – JoshAdel

+0

這是有道理的。謝謝! – ShanZhengYang