假设我得到了一个Python类的实例。该类具有一个函数,我想从该类中提取并隔离该函数。最终函数需要有权访问原始类的属性值,但否则根本不应调用该类。
[我的动机是我想使用jit
中的numba来编译函数,但是我不想使用jitclass
来编译整个类。>
作为具体示例,请考虑以下类。理想情况下,我不想修改此代码:
class Adder: """ A minimal callable class with keyword arg """ def __init__(self, num=4): self.num = num def add(self, val1, val2): return val1 + val2 def add_default(self, val1, val2): return self.num + val1 + val2
我现在实例化这些对象,然后尝试使用numba编译其方法。当实例方法不使用任何对象的属性时,此方法有效
from numba import jit a = Adder(num=1) print(a.add(7, 8)) # 15 add_fast = jit(a.add) print(add_fast(7, 8)) # 15
但是,当我尝试使用需要类属性的方法时,这会中断
from numba import jit a = Adder(num=1) print(a.add_default(7, 8)) # 16 add_default_fast = jit(a.add_default) print(add_default_fast(7, 8)) # NotDefinedError: Variable 'self' is not defined.
我尝试使用lambda函数,但仍在内部引用该类并中断jit。理想情况下,我想提取实例方法以及所有实例属性的值,并构建一个新函数,将所有
self.
变量替换为实例属性中的值。是否有一种简单的方法?我希望找到一种不涉及重构类的解决方案。
假设我得到了一个Python类的实例。该类具有一个函数,我想从该类中提取并隔离该函数。最终功能需要访问...
尝试一下:
def add_default(a,*args):
return Adder.__dict__['add_default'](a,*args)
add_default_fast = jit(add_default,forceobj=True)
print(add_default_fast(a,7, 8)) # 16