Numba、带 nopython 模式和字典的 Jitclass

Numba, Jitclass w/ nopython mode and dictionaries

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

有一个相当大的递归模型(几乎是一个巨大的 for 循环),它 - 给定路径相关的计算,不能用直接的 Numpy 向量化。

class 遍历一系列 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,有什么办法可以跳过这个字典方面的 jit 吗?

不,如果您创建 jitclass 每个属性都必须输入,并且从 numba 0.34 开始不支持包含函数(即使已编译)的字典或 lists/tuples。例如尝试使用 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 class.

中调用的 jitted 函数

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