如何在python中并行化big for循环
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何在python中并行化big for循环,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2497字,纯文字阅读大概需要4分钟。
内容图文
我刚接触Python,但仍处于学习曲线的艰难阶段.感谢您的任何评论.
我有一个很大的for循环要运行(在许多迭代中都很大),例如:
for i in range(10000)
for j in range(10000)
f((i,j))
我虽然认为这是如何并行化的常见问题,但在Google上搜索了数小时后,我使用“多重处理”模块找到了解决方案,如下所示:
pool=Pool()
x=pool.map(f,[(i,j) for i in range(10000) for j in range(10000)])
当循环较小时,此方法有效.但是,如果循环很大,那确实很慢;或者如果循环太大,有时会发生内存错误.看来python会首先生成参数列表,然后甚至使用xrange将列表提供给函数“ f”.那是对的吗?
所以这种并行化对我来说不起作用,因为我真的不需要将所有参数都存储在列表中.有一个更好的方法吗?我感谢任何建议或参考.谢谢.
解决方法:
It seems that python would generate the list of arguments first, and then feed the list to the function “f”, even using xrange. Is that correct?
是的,因为您使用的是列表推导,它明确要求它生成该列表.
(请注意,xrange在这里并不是真正相关的,因为一次只有两个范围,每个范围都是10K;与参数列表的100M相比,没什么.)
如果希望它根据需要动态生成值,而不是一次生成所有100M,则要使用生成器表达式而不是列表推导.几乎总是将括号变成括号的问题:
x=pool.map(f,((i,j) for i in range(10000) for j in range(10000)))
但是,从the source中可以看到,如果给map提供一个生成器,map最终只会列出一个列表,因此在这种情况下,它什么也解决不了. (文档没有明确说明这一点,但是很难看到如果没有长度,如何选择合适的块大小将可迭代对象切成小段……).
而且,即使事实并非如此,结果仍然会再次遇到相同的问题,因为pool.map返回一个列表.
要解决这两个问题,可以改用pool.imap.它懒惰地消耗可迭代,并返回结果的惰性迭代器.
需要注意的一件事是,如果您不通过imap,imap不会猜测最佳的块大小,而只是默认为1,因此您可能需要一些思考或反复试验来优化它.
另外,imap仍会在输入结果时将它们排入队列,因此它可以按照参数的顺序将它们反馈给您.在病理情况下,它可能最终导致结果排队(poolsize-1)/ poolsize,尽管实际上这很少见.如果要解决此问题,请使用imap_unordered.如果您需要了解顺序,只需将参数与参数和结果来回传递即可:
args = ((i, j) for i in range(10000) for j in range(10000))
def indexed_f(index, (i, j)):
return index, f(i, j)
results = pool.imap_unordered(indexed_f, enumerate(args))
但是,我注意到在您的原始代码中,您对f(i,j)的结果根本不做任何事情.在那种情况下,为什么还要费心收集所有结果呢?在这种情况下,您可以返回循环:
for i in range(10000):
for j in range(10000):
map.apply_async(f, (i,j))
但是,imap_unordered可能仍然值得使用,因为它提供了一种非常简便的方法来阻止所有任务完成,同时仍使池本身处于运行状态以供以后使用:
def consume(iterator):
deque(iterator, max_len=0)
x=pool.imap_unordered(f,((i,j) for i in range(10000) for j in range(10000)))
consume(x)
内容总结
以上是互联网集市为您收集整理的如何在python中并行化big for循环全部内容,希望文章能够帮你解决如何在python中并行化big for循环所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。