7

美好的一天,我正在为一些数字工作编写一个 Python 模块。由于发生了很多事情,我最近几天一直在优化代码以缩短计算时间。但是,我有一个关于 Numba 的问题。基本上,我有一个包含一些字段的类,这些字段是 numpy 数组,我通过以下方式对其进行初始化:

def init(self):
    a = numpy.arange(0, self.max_i, 1)
    self.vibr_energy = self.calculate_vibr_energy(a)

def calculate_vibr_energy(i):
    return numpy.exp(-self.harmonic * i - self.anharmonic * (i ** 2))

因此,代码是矢量化的,并且使用 Numba 的 JIT 会带来一些改进。但是,有时我需要从类外部访问 calculate_vibr_energy 函数,并传递一个整数而不是数组来代替 i。据我了解,如果我在 calculate_vibr_energy 上使用 Numba 的 JIT,它必须始终将数组作为参数。

那么,以下哪个选项更好: 1) 创建一个新函数 calculate_vibr_energy_single(i),它只接受一个整数,并在其上使用 Numba 2) 替换与此类似的函数的所有用法:

myclass.calculate_vibr_energy(1)

有了这个:

tmp = np.array([1])
myclass.calculate_vibr_energy(tmp)[0]

还是有其他更有效(或至少更 Python-ic)的方法来做到这一点?

4

1 回答 1

1

我只玩了一点 numba ,所以我可能弄错了,但据我了解,使用“autojit”装饰器应该提供可以接受任何类型参数的函数。

参见例如http://numba.pydata.org/numba-doc/dev/pythonstuff.html

于 2013-06-29T23:20:29.933 回答