我可以观察到运行这段代码的 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 曾经有单独的 int
和 long
类型,而 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/