python-2.7 - 性能 : Multiprocessing with shared object between Python 3. 5 和 2.7

标签 python-2.7 performance python-3.x

我可以观察到运行这段代码的 python 2.7 和 3.5 之间存在巨大的时间差异。这似乎是由于我的共享对象 _SharedProgress 但我不明白为什么 python 3.5(运行 12 秒)比 2.7(运行 1 秒)慢得多。 事实上,如果我评论 progress.update(),性能几乎相同(3.5 仍然慢一点)。

有人可以解释一下为什么吗? :) 当然我想保留 2.7 性能和 3.5...

from __future__ import print_function
from multiprocessing import Process
from multiprocessing.managers import BaseManager
from time import time


class _SharedProgress(object):
    current = 0

    def get(self):
        return self.current

    def update(self, new_value=1):
        self.current += new_value


class _GlobalManager(BaseManager):
    BaseManager.register('SharedProgress', _SharedProgress)


class WorkManager:
    def __init__(self, nbWorkers, workerTask):
        self.manager = _GlobalManager()
        self.sharedProgress = None
        self.totalProgress = nbWorkers * 100
        self.pool = []
        start = time()
        self.manager.start()
        self.sharedProgress = self.manager.SharedProgress()
        inputs = [(self.sharedProgress,) for _ in range(nbWorkers)]

        processToLaunch = [i for i in range(nbWorkers)]
        for i in processToLaunch:
            self.pool.append(Process(target=workerTask, args=inputs[i]))
        while processToLaunch or any((w.is_alive() for w in self.pool)):
            if processToLaunch:
                self.pool[processToLaunch.pop(0)].start()
                if self.sharedProgress.get() == self.totalProgress:
                    break
        print("DONE in {}!".format(time() - start))


def __workerTask(progress):
    prevPercent, current, currentPercent, total = 0, 0, 0, 10000
    for i in range(total):
        current += 1
        currentPercent = (current * 100) / total
        if currentPercent != prevPercent:
            progress.update(currentPercent - prevPercent)  # IF I COMMENT THIS LINE, PERFOS ARE ALMOST IDENTICAL
            prevPercent = currentPercent


if __name__ == '__main__':
    WorkManager(10, __workerTask)

最佳答案

主要区别来自于划分。在 Python 3 中,用 / 除两个整数值将始终产生 float,在 Python 2 中它仍然是 int。您可以使用 // 强制两个版本的 python2 行为:

currentPercent = (current * 100) // total

或者通过初始化current = 0来实现python3行为。。仍然存在一些性能差距,这可能是由于 Python 2 和 3 中不同的 int 类型引起的。Python 2 曾经有单独的 intlong 类型,而 Python 3 只有一种统一的 int 类型,它涵盖了这两种类型。如果强制 Python 2 使用 long (current = 0L),它会变得比 Python 3 版本还要慢。

关于python-2.7 - 性能 : Multiprocessing with shared object between Python 3. 5 和 2.7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45168075/

相关文章:

python - 无法创建 django 模型的新实例

javascript - Google Closure 库的基准测试

python - 为什么 Python 中的某些列表方法仅适用于已定义的变量?

mysql - python mysql insert syntax error 当只有一个变量

python - 我怎样才能加速这个真正基本的Python脚本来偏移数字行

python - 在 Wing101 中切换到 Python 3.6

Python - 随机婴儿名字生成器问题 - (重复输入,调用变量)

python-3.x - 是否可以在 python 中编写 vagrant 配置文件?

python - pyserial写入功能 block 不写入数据并且不会超时

asp.net-mvc - ASP.Net MVC Razor Views - 在构建时缩小 HTML