其他代码未注释掉时,多处理速度很慢

时间:2014-12-12 00:44:50

标签: python multiprocessing buffer

我正在尝试学习多处理并使用了这组代码:

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秒。这很好,因为多处理工作正常。

但是,为什么我必须注释掉第一个测试只是为了它的工作?我测量的是错误的吗?当我同时运行两个测试时,为什么输出会在一瞬间出现?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

在Windows上,多处理通过导入模块来重建程序状态,以便它可以取消处理所需的对象。特别是,它导入主模块。这意味着将执行所有顶级命令。在您的情况下,子进程重新执行TEST 1,这会扭曲您的性能数字。

嵌套在if __name__ == '__main__':块中的代码未执行,因为导入模块而不是作为脚本运行时,它的模块名称不是“ main ”(除非您将其命名为模块__main__.py)。您可以在__main__下移动TEST 1,也可以将其设为__main__下调用的函数。