我试图弄清楚如何使用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
的正确方法是什么?
我知道在这个特定的实例中,有些东西可以移动,但它的设置尽可能接近我的真实项目。
顺便说一句,如果我只是用 nopython=True
替换 dostuff
的签名,然后添加 self
作为第一个参数,它至少超过了这一点,实际上打印了一个关于编译类型的错误,我的真实项目由于某种未知的原因而拒绝这样做,我无法复制。
最佳答案
您可以尝试将其定义为 staticmethod
:
@staticmethod
def doStuff(j):
# code goes here
这样,您就不必传入对 self
的引用,并且该方法仍然可以保留在类中。
关于python - 错误: number of arguments and self,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49580415/