错误:参数数量和自我

时间:2018-03-30 19:38:56

标签: python numba

我试图找出如何使用numba来最好地预编译长时间运行的函数并将其放在QThread中。不幸的是,我遇到了各种各样的问题(一个甚至是numba没有打印错误,只是崩溃程序)。

我整理了一个小代码示例,试图至少使其成功,但那仍然存在问题。

main.py

import sys
from PyQt5 import QtCore, QtGui, QtWidgets, uic

import workClass

class MainWindow(QtWidgets.QMainWindow):

    def __init__(self):
        t = workClass.longThread()
        t.start()

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec_())

workclass.py

import numpy as np
from PyQt5.QtCore import QThread
from numba import jit
import time

class longThread(QThread):

    def __init__(self):
        super(longThread, self).__init__()
        return None

    def run(self):
        start = int(round(time.time() * 1000))
        j = np.iinfo(np.long).max
        print(self.doStuff(j))
        print(str(int(round(time.time() * 1000)) - start))

    @jit("float64(int32)")
    def doStuff(j):

        for i in range(0, 1000000):
            j = np.sqrt(j)
        return j

当我跑步时,我得到:

TypeError: too many arguments: expected 1, got 2 at print(self.doStuff(j))

我认为这是python传递self以及j。但是,如果我将self添加到doStuff的def中,那么numba会发出呜呜声,因为它无法编译self。那么,设置numba的正确方法是什么?

我知道这是一个特殊的例子,有些东西可以移动,但是这个设置尽可能接近我的真实项目。

顺便说一句,如果我只是将dostuff的签名替换为nopython=True,然后添加self作为第一个参数,那么它至少会超过该点并实际输出有关编译的错误这个类型,我的真实项目因某些未知的原因而拒绝做,我无法复制。

1 个答案:

答案 0 :(得分:3)

您可以尝试将其定义为staticmethod

@staticmethod
def doStuff(j):
    # code goes here

这样,您就不必将引用传递给self,并且该方法仍然可以保留在类中。