Numba,Jitclass w / nopython模式和词典

时间:2017-08-28 17:45:05

标签: python numpy dictionary numba

试图找出在使用jitclass时如何跳过类方法。

有一个非常大的递归模型(几乎是一个巨大的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,有没有什么方法可以跳过这个字典方面?

2 个答案:

答案 0 :(得分:1)

不,如果您创建jitclass必须键入每个属性,并且从numba 0.34开始不支持包含函数的字典或列表/元组(即使jitted)。例如,尝试使用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值应为Numba类型实例,得到<class 'dict'>

此外,使用isinstance以及tryexcept也不能在nopython模式下工作。

您最好的选择是使用从纯Python类中调用的jit ted函数。

答案 1 :(得分:1)

关于在Numba编译函数中使用字典,正如MSeifert所说,Numba不支持这一点。在我自己的工作中,我遇到了这个问题,并在Numba找到了一个实现(不是我创建的)字典的实现很好,它的GitHub存储库可以找到here

相关问题