Skip to main content
 首页 » 编程设计

调用并行模块时 Python 计时代码不正确之我的代码或模块

2025年05月04日8lexus

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

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

当我用多线程运行代码时;时间小得不合理 - 使用 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()。