当前位置:  开发笔记 > 编程语言 > 正文

如何在类的成员函数上使用numba?

如何解决《如何在类的成员函数上使用numba?》经验,为你挑选了2个好方法。

我正在使用稳定版的Numba 0.30.1.

我可以做这个:

import numba as nb
@nb.jit("void(f8[:])",nopython=True)                             
def complicated(x):                                  
    for a in x:
        b = a**2.+a**3.

作为一个测试案例,加速是巨大的.但是如果我需要加速一个类中的函数,我不知道如何继续.

import numba as nb
def myClass(object):
    def __init__(self):
        self.k = 1
    #@nb.jit(???,nopython=True)                             
    def complicated(self,x):                                  
        for a in x:
            b = a**2.+a**3.+self.k

我用什么numba类型的self对象?我需要在类中包含此函数,因为它需要访问成员变量.



1> 小智..:

我当时的处境非常相似,我找到了在类中使用Numba-JITed函数的方法。

诀窍是使用静态方法,因为这种方法不会称为将对象实例放在参数列表之前。无法访问的缺点self是您不能使用在方法外部定义的变量。因此,您必须将它们从具有访问权限的调用方法传递给静态方法self。就我而言,我不需要定义包装方法。我只需要将要JIT编译的方法分为两个方法。

对于您的示例,解决方案将是:

from numba import jit

class MyClass:
    def __init__(self):
        self.k = 1

    def calculation(self):
        k = self.k
        return self.complicated([1,2,3],k)

    @staticmethod
    @jit(nopython=True)                             
    def complicated(x,k):                                  
        for a in x:
            b = a**2 .+ a**3 .+ k



2> JoshAdel..:

您有几种选择:

使用jitclass(http://numba.pydata.org/numba-doc/0.30.1/user/jitclass.html)对整个内容进行“数字化处理”。

或者将成员函数包装,并通过以下方式传递成员变量:

import numba as nb

@nb.jit
def _complicated(x, k):
    for a in x:
        b = a**2.+a**3.+k

def myClass(object):
    def __init__(self):
        self.k = 1

    def complicated(self,x):                                  
        _complicated(x, self.k)


我已经在“ jitclass”上看到了该页面,但是在那儿我如何显式声明每个成员函数的数据类型是完全不清楚的。你能举个例子吗?包装函数方法变得不雅致,打破了我把东西放在类中的初衷。
推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有