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

标签 python multithreading parallel-processing multiprocessing

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

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

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

相关文章:

python - 从列表中传递参数

android - 谷歌云消息认证错误 (401)

c# - 线程非常快地获得 100% CPU

multithreading - 为什么多线程应用程序通常会扩展不良?

Python 多处理 : kill process if it is taking too long to return

python - 如果 python 中没有选项,optparse 可以工作

python - sklearn 中以度量为参数的回归分数

c++ - Lambda 和线程

Java 线程在同步块(synchronized block)上加锁

c - OpenMP 范围界定 - 段。共享错误()