我试图找出如何使用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
作为第一个参数,那么它至少会超过该点并实际输出有关编译的错误这个类型,我的真实项目因某些未知的原因而拒绝做,我无法复制。
答案 0 :(得分:3)
您可以尝试将其定义为staticmethod
:
@staticmethod
def doStuff(j):
# code goes here
这样,您就不必将引用传递给self
,并且该方法仍然可以保留在类中。