试图找出在使用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,有没有什么方法可以跳过这个字典方面?
答案 0 :(得分:1)
不,如果您创建jitclass
必须键入每个属性,并且从numba 0.34开始不支持包含函数的字典或列表/元组(即使jitted)。例如,尝试使用dict
或object
作为类型:
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
以及try
和except
也不能在nopython模式下工作。
您最好的选择是使用从纯Python类中调用的jit
ted函数。
答案 1 :(得分:1)
关于在Numba编译函数中使用字典,正如MSeifert所说,Numba不支持这一点。在我自己的工作中,我遇到了这个问题,并在Numba找到了一个实现(不是我创建的)字典的实现很好,它的GitHub存储库可以找到here。