我正在尝试学习多处理并使用了这组代码:
from multiprocessing import Pool
import math, time
def isPrime(n):
if n<2:
return False
if n==2:
return True
max = int(math.ceil(math.sqrt(n)))
i = 2
while i <= max:
if n % i == 0:
return False
i +=1
return True
def sumPrimes(n):
return sum([x for x in xrange(2,n) if isPrime(x)])
li = list(xrange(0, 50000, 1000))
# TEST 1
st = time.time()
results = []
for l in li:
results.append(sumPrimes(l))
print results
print "Took %s seconds." % repr(time.time()-st), "\n"
# TEST 2
if __name__ == '__main__':
st = time.time()
pool = Pool(4)
results = pool.map(sumPrimes, li)
pool.close()
pool.join()
print results
print "Took %s seconds." % repr(time.time()-st)
如果我同时运行测试1和测试2,我得到测试1需要3.500秒而测试2需要9.161秒。输出也有一刻 - 我希望测试2在测试1后输出9.16秒。
然而,如果我评论测试1,测试2需要2.152秒。这很好,因为多处理工作正常。
但是,为什么我必须注释掉第一个测试只是为了它的工作?我测量的是错误的吗?当我同时运行两个测试时,为什么输出会在一瞬间出现?
感谢您的帮助!
答案 0 :(得分:1)
在Windows上,多处理通过导入模块来重建程序状态,以便它可以取消处理所需的对象。特别是,它导入主模块。这意味着将执行所有顶级命令。在您的情况下,子进程重新执行TEST 1,这会扭曲您的性能数字。
嵌套在if __name__ == '__main__':
块中的代码未执行,因为导入模块而不是作为脚本运行时,它的模块名称不是“ main ”(除非您将其命名为模块__main__.py
)。您可以在__main__
下移动TEST 1,也可以将其设为__main__
下调用的函数。