调用并行模块时Python计时代码不正确-我的代码还是模块?

调用并行模块时Python计时代码不正确-我的代码还是模块?,python,multithreading,parallel-processing,multiprocessing,Python,Multithreading,Parallel Processing,Multiprocessing,我有一些运行数学模拟的代码,并对其进行计时 当我在没有多线程的情况下运行这段代码时,计时代码工作得非常好 当我用多线程运行代码时;时间太少了——用手表,我估计它比实际代码运行的时间快4-8倍。(代码运行大约需要12秒,时间模块显示为1.5-2.5秒) 简化代码:(控制流在下面稍微详细解释) 我有另一个类实例化这个GenX类,然后运行GenX.optimize(),开始模拟 模拟是一个单独的模块,在内部处理线程代码(它也是一个1000行的类,其中大约50%是不必要的getter/setter…因此

我有一些运行数学模拟的代码,并对其进行计时

当我在没有多线程的情况下运行这段代码时,计时代码工作得非常好

当我用多线程运行代码时;时间太少了——用手表,我估计它比实际代码运行的时间快4-8倍。(代码运行大约需要12秒,
时间
模块显示为1.5-2.5秒)

简化代码:(控制流在下面稍微详细解释)

我有另一个类实例化这个GenX类,然后运行GenX.optimize(),开始模拟

模拟是一个单独的模块,在内部处理线程代码(它也是一个1000行的类,其中大约50%是不必要的getter/setter…因此我认为作者可能是问题的根源)

一旦模拟完成,它将调用log_results,计算所用的时间,这是不正确的

目前我不知道错误的来源是我的代码还是我正在使用的模块


我已经检查了模块的作者是否在完成并行操作时调用了pool.join(),它确实被调用了,但计时仍然不正确。

这取决于您有多少线程,CPU一次处理多少线程,以及线程在做什么,我假设这与以下问题有关:。这可能是因为时钟只是测量处理时间而不是墙上的时间,所以您得到的值低于您预期的值


请尝试改用time.time()。

是否要阻止工作线程直到它们完成?是-处理多处理代码的模块会调用该函数。我已经更新了问题。您是否尝试打印所有存在self.time1更改的位置?另外,我建议您创建一个decorator@timer,并检查您在每个步骤上花费的时间。对于程序的每次运行,self.time1只分配给一次,即上面代码中所示的阶段。它在其他任何地方都不会被修改。我个人对装饰师还不熟悉,而且计时代码也不重要,所以我通过简单的经验确定它大约是5的一个因子,然后再乘以它,现在就可以了。。。虽然有点黑!
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