调用并行模块时,Python时序代码不正确 - 我的代码或模块?

时间:2014-02-04 18:10:03

标签: python multithreading parallel-processing multiprocessing

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

当我在没有多线程的情况下运行此代码时,时序代码完全正常。

当我使用多线程运行代码时;时间过小是非常小的 - 使用手表,我估计它比实际代码运行的时间快大约4-8倍。 (代码需要大约12秒才能运行,time模块需要1.5-2.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

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

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

模拟完成后,它会调用log_results,它会计算所需的时间 - 这是不正确的。

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

我已经检查过模块的作者在完成并行操作时调用pool.join() - 它会被调用但是时间仍然不正确。

1 个答案:

答案 0 :(得分:1)

根据您拥有的线程数,CPU一次处理的线程数以及线程正在执行的操作,我认为这与以下问题有关:https://codereview.stackexchange.com/a/26669。可能是因为时钟只是测量处理时间而不是测量时间,所以你获得的值低于你期望的值。

尝试使用time.time()代替。