NumbaPro JIT是一个类构造函数

时间:2015-03-16 15:00:50

标签: python jit numba

我正在寻找一种方法将JIT用于python类构造函数,如下所示:

import numpy as np
from numbapro import jit, autojit
from time import time

class Test(object):
    @jit((float, float, float), target="cpu")
    def __init__(self, x, y, z):
        self._x = x
        self._y = y
        self._z = z

    @autojit
    def runTest(self):
        N = 1000000
        self._z = 0
        for i in xrange(N):
            self._z = self._z + np.sin(i)

        return self._z

if __name__ == '__main__':
    a = Test(4,5,6)

    start_time = time()
    z = a.runTest()
    end_time = time() # Get the CPU end time
    print("Math Time: {0} s".format(end_time - start_time))
    print z

但是,似乎我必须为self提供一种类型,我不知道如何实现。
也许有人知道怎么解决这个问题?

提前致谢
岸堤

1 个答案:

答案 0 :(得分:1)

从版本0.12 {nna}中删除了对“jitting”类的支持:here is the Github issue。曾经有support for classes in Numba,称为“扩展类型”,但现在所有相关示例都不起作用,如果使用当前版本(0.17)执行,则给出:TypeError: 'NotImplementedType' object is not callable

因此我强烈建议您将runTest功能移动到自己的功能,并使用a tuplea numpy array将数据传递给功能,因为支持这些机制。否则,你将无法使用旧版本的numba。

class Test(object):

    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z


@jit(float(float))
def runTest(z):
    N = 1000000
    z = 0
    for i in xrange(N):
        z = z + np.sin(i)
    return z


if __name__ == '__main__':
    a = Test(4,5,6)

    start_time = time()
    z = runTest(a.z)
    end_time = time() # Get the CPU end time
    print("Math Time: {0} s".format(end_time - start_time))
    print z