2017-08-28 88 views
1

試圖找出如何在使用jitclass時跳過一個類方法。Numba,Jitclass w/nopython模式和字典

有一個非常大的遞歸模型(非常多,一個巨大的for循環),其中 - 給定路徑相關的計算,不能用直Numpy矢量化。

類貫穿一系列numpy的陣列,通常numba友好的語法,但我有一個部分中調用了幾個以有序的方式方法:

def operations(self, i, ops_order_config): 

    ops_dict = self.ops_dict 

    for index in range(len(waterfall_config)): 
     try: 
      if isinstance(ops_config[index], tuple): 
       ops_dict[ops_config[index][0]](i, ops_config[index][1]) 
      else: 
       ops_dict[ops_config[index]](i) 
     except KeyError: 
      pass 

該模型的一部分對於靈活性非常重要 - 「config」是包含適當調用方法的元組的有序列表,以及相應的參數。 ops_dict擁有實際的自我。這是從配置調用,具有適當的參數。

如果我正在創建一個jitclass,有沒有什麼辦法可以跳過這個字典方面?

回答

0

不,如果你做一個jitclass每個屬性都必須被鍵入,並且包含函數的字典或者列表/元組(包括函數)(即使是jitted)在numba 0.34時不被支持。例如試圖用dictobject類型:

import numpy as np 
from numba import jitclass 

spec = [('dct', dict)] 

@jitclass(spec) 
class ClsWithObject(object): 
    def __init__(self, value): 
     self.dct = {} 

拋出一個TypeError

TypeError: spec values should be Numba type instances, got <class 'dict'>

此外,使用isinstance以及tryexcept不nopython模式既不工作。

你最好的選擇是使用從純Python類中調用的ted函數。

+0

謝謝。當jitclass被使用並工作時,nopython模式被應用是否是一個安全的假設? – user7038639

+0

@ user7038639是的。該類的所有方法都將以nopython模式編譯。 [docs](http://numba.pydata.org/numba-doc/dev/user/jitclass.html)明確提到它:「jitclass的所有方法都被編譯成nopython函數.jitclass實例的數據是在堆上分配爲C兼容結構,以便任何編譯函數都可以直接訪問底層數據,繞過解釋器。「 :) – MSeifert

+0

布拉,通過這些文檔10次,似乎錯過了。謝謝! – user7038639

0

關於在Numba編譯函數中使用字典,正如MSeifert所說,Numba不支持這一點。在我自己的工作中,我遇到了這個問題,並且發現了一個非常好用的Numba字典實現(不是我創建的),它的GitHub存儲庫可以在here找到。