我有一些运行数学模拟并对其计时的代码。
当我在没有多线程的情况下运行这段代码时,计时代码工作得非常好。
当我用多线程运行代码时;时间小得不合理 - 使用 watch ,我估计它比实际代码运行时间快 4-8 倍。 (代码运行大约需要 12 秒,time
模块显示为 1.5-2.5s)
简化代码:(控制流程在下面稍微详细解释)
class GenX:
def log_results(self, solver):
time2 = time.clock()
print '%0.3f' % time2 - self.time1
^
##### this value is incorrect ###########
def __init__(self):
self.time1 = time.clock()
mySimulation.setup()
mySimulation.OnceCompleteCall(log_results)
## (in reality both setup and start are more complicated)
def optimize(self):
mySimulation.start()
return
我有另一个实例化这个 GenX 类的类,然后运行 GenX.optimize(),开始模拟。
模拟是一个单独的模块,在内部处理线程代码(它也是一个 1000 行的类,其中大约 50% 是不必要的 getters/setters...所以我认为作者很可能是问题的根源)
模拟完成后,它会调用 log_results,计算所用时间 - 这是不正确的。
目前我不知道错误的来源是我的代码还是我正在使用的模块。
我检查过模块的作者在完成并行操作时调用了 pool.join()
- 它确实被调用了,但时间仍然不正确。
最佳答案
根据您拥有的线程数、您的 CPU 一次处理的线程数以及线程在做什么,我认为这与以下问题有关:https://codereview.stackexchange.com/a/26669 .可能是因为时钟只是测量处理时间而不是挂钟时间,所以您获得的值低于您的预期。
尝试改用 time.time()。
关于调用并行模块时 Python 计时代码不正确 - 我的代码或模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21560111/