Python 多处理计算性能优化



我目前正在研究在运行时间相对较长的代码段上实现多处理。它基本上应用了一个非常复杂的函数相当多的次数。目前我正在使用以下语法:

if (__name__ == '__main__'):
pool = Pool(4)
results = pool.map(function,data) 
pool.close()
output = pool.join()

我的 CPU 由 4 个内核组成,因此是 Pool(4)。我从我的 CPU 使用率中看到,在实现多处理时,所有 4 个池都使用大约 25% 的可用 CPU,而不使用多处理时,一个 CPU 内核使用 25%。但是,我看到四个 CPU 内核使用的内存量要低得多:每个内核大约 45k,而在一个没有多处理的 CPU 内核上运行时几乎是 550k(内存不足似乎不是问题,因为它始终保持在大约 27% 的利用率)。在一个 CPU 内核上计算大约需要 5 分钟,并且在所有 4 个 CPU 内核上运行时,仍然有一个小时没有完成。有人能就这种低效率的根本原因提出一些专家观点吗?

祝您编码愉快!

这听起来像您更新的代码,对我有用:

import time
from multiprocessing import Pool
def function(x):
return x * x
if __name__ == '__main__':
start = time.time()
pool = Pool(1)
data = range(50)
results = pool.map(function, data)
pool.close()
output = pool.join()
print results
print 'in %.4f seconds' % (time.time() - start)

从命令行运行它:

c:srvtmp> python mptest.py
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 729, 784, 841, 900, 961, 1024, 1089, 1156, 1225, 1296, 1369, 1444, 1521, 1600, 1681, 1764, 1849, 1936, 2025, 2116, 2209, 2304, 2401]
in 0.2950 seconds

我们可以添加一些日志记录function

def function(x):
print('inside function(%r)' % x)
res = x * x
print('returning from function(%r) => %r' % (x, res))
return res

运行data = range(20)pool = Pool(2),我们可以看到两个进程争夺输出:

c:srvtmp> python mptest.py
inside function(0)
inside function(3)returning from function(0) => 0
rinside function(1)eturning from function(3) => 9
rieturning from function(1) => 1nside function(4)
irnside function(2)eturning from function(4) => 16
rieturning from function(2) => 4nside function(5)
irnside function(6)eturning from function(5) => 25
irnside function(9)eturning from function(6) => 36
rieturning from function(9) => 81nside function(7)
irnside function(10)eturning from function(7) => 49
rieturning from function(10) => 100nside function(8)
irnside function(11)eturning from function(8) => 64
rieturning from function(11) => 121nside function(12)
irnside function(15)eturning from function(12) => 144
rieturning from function(15) => 225nside function(13)
irnside function(16)eturning from function(13) => 169
rieturning from function(16) => 256nside function(14)
irnside function(17)eturning from function(14) => 196
rieturning from function(17) => 289nside function(18)
returning from function(18) => 324
inside function(19)
returning from function(19) => 361
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361]
in 0.2700 seconds

相关内容

  • 没有找到相关文章

最新更新