用numba处理容器中多个常量的最佳方法?

麦可

编辑:这个问题已经严重过时了!numba现在支持Enumnamedtuple开箱,这既提供用于分组常数合理的解决方案。


我在python中做一些移位,想用numba加快速度。为此,我有很多常量整数值,必须以一种易于理解的方式进行处理。我想将它们组合在一起,成为枚举式对象,使所有常量在一个名称空间中,可以通过attribute-get运算符进行访问。当然,我也想让numba理解那里发生的事情,以便它可以通过jit编译保持高速。我首先也是最天真的尝试是这样的:

class SomeConstantsContainer:
    SOME_NAME = 0x1
    SOME_OTHER_CONSTANT = 0x2
    AND_ANOTHER_CONSTANT = 0x4

不幸的是,当我查看批注时,numba似乎不了解值是恒定的,并且总是回落到对python对象的慢速对象访问上。这就是注释所说的:

#   $29.2 = global(SomeConstantsContainer: <class 'constants.SomeConstantContainer'>)  :: pyobject
#   $29.3 = getattr(attr=SOME_VARIABLE, value=$29.2)  :: pyobject

我知道我总是会退缩到这样的地方:

from numpy import np
SOME_STUPID_CONSTANT = np.int64(0x1)
ANOTHER_STUPID_CONSTANT = np.int64(0x2)

在那种情况下,jit编译器a)不需要查找容器的属性,b)肯定知道它必须处理一个普通整数。这样写真是太丑了。我可以将所有常量明确标记为整数,或者让容器来做。尽管如此,我确实很想将这些常数分组在容器中,以使其更加清晰,并且jit编译版本理解该语法,而不是为了每次使用该常数而浪费一些缓慢的python属性查找时间。有没有更好的主意,如何使第二种方法更像第一种方法,同时又保持较高的执行速度?是否有一些numba可以理解的枚举容器,我只是错过了?

编辑:也使用新enum容器是没有帮助的:

@enum.unique
class SomeConstantsContainer(enum.IntEnum):
    SOME_NAME = 0x1
    SOME_OTHER_CONSTANT = 0x2
    AND_ANOTHER_CONSTANT = 0x4

这给出:

    #   $42.3 = global(SomeConstantsContainer: <enum 'SomeConstantsContainer'>)  :: pyobject
    #   $42.4 = getattr(attr=SOME_OTHER_CONSTANT, value=$42.3)  :: pyobject
戴维

一种不同的方法,但是仍然具有包含变量的优点的一种方法是在包装函数中使用捕获的变量:

def make_numba_functions():
    SOME_NAME = 0x1
    SOME_OTHER_CONSTANT = 0x2
    AND_ANOTHER_CONSTANT = 0x4

    @jit
    def f1(x,y):
        useful code goes here

    @jit
    def f2(x,y,z):
        some more useful code goes here

    return f1, f2

f1,f2 = make_numba_functions()

您显然可以将此与使用类作为名称空间结合起来,并在外部函数中解压缩内容。

当我尝试这与一个非常基本的例子,用inspect_types我得到

$0.1 = freevar(A: 10.0)  :: float64

(这A只是我的常数)。我怀疑这就是您想要的。我确实尝试查看了生成的汇编器(os.environ['NUMBA_DUMP_ASSEMBLY']='1'),但是我在汇编器方面的能力不足以挑选相关的行并确认其是否符合您的要求。但是-它确实使用进行编译nopython=True,这至少表明它可以有效地工作。

有点hack,但希望效果很好!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

用Java实现常量的最佳方法是什么?

用Java中的流API替换多个FOR循环的最佳方法

在Go中枚举常量的最佳方法

处理容器控制器中的子视图控制器的UINavigationItem更改的最佳实践?

在多个容器中存储对象的最佳实践

Docker:处理Docker容器内apt-get中软件包安全更新的最佳方法

处理多个NSURL连接的最佳方法

处理多个SKScenes的最佳方法是什么?

Azure批处理容器配置中Azure容器注册表的AD服务主体?

处理多个对象实例的最佳方法

处理JavaScript中相同属性的多个赋值的最佳方法

在Django中存储常量的最佳方法

单个主机上的AWS批处理容器限制数量

在单个Docker容器中运行多个Flask应用程序的最佳方法

如何在React中处理容器元素中的加载/旋转

在NodeJS中处理多个http调用的最佳方法

用angular处理多个项目的最佳方法是什么?

处理在R中连接的多个表的最佳方法是什么?

在React Hooks中处理常量的最佳实践

k8s管理/处理容器内部的机密

处理Redis中多个列表的最佳方法?

处理具有多个语义的多个常量的最佳方法

处理每个对象的多个选择的最佳方法

处理多个JavaScript检查的最佳方法

在 C 中存储常量数据的最佳方法

在快速路线中处理多个功能/场景的最佳方法?

在 Docker 堆栈中在哪里存储/管理容器的配置?

如何在本地开发中处理容器化 OIDC 服务器的 https?

处理多个状态更改的最佳方法