2017-08-28 132 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找到。