首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何并行化python中的大for循环

如何并行化python中的大for循环
EN

Stack Overflow用户
提问于 2013-08-29 19:23:36
回答 1查看 2.6K关注 0票数 3

我刚开始学习Python,我还处在学习曲线的陡峭阶段。谢谢您的评论。

我有一个很大的for循环要运行(在很多迭代的意义上都很大),例如:

代码语言:javascript
运行
复制
for i in range(10000)
    for j in range(10000)
        f((i,j))

我认为如何并行化是一个常见的问题,在google上搜索了几个小时之后,我找到了使用“多处理”模块的解决方案,如下所示:

代码语言:javascript
运行
复制
pool=Pool()
x=pool.map(f,[(i,j) for i in range(10000) for j in range(10000)])

当循环很小时,这是可行的。但是,如果循环很大,它会非常慢,或者如果循环太大,有时会出现内存错误。似乎python会首先生成参数列表,然后将列表提供给函数"f",甚至使用xrange。对吗?

所以这种并行化不适合我,因为我实际上不需要将所有参数存储在一个列表中。有更好的方法吗?如有任何建议或参考,我深表感谢。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-29 19:26:35

似乎python会首先生成参数列表,然后将列表提供给函数"f",甚至使用xrange。对吗?

是的,因为您使用的是列表理解,它明确要求它生成该列表。

(请注意,xrange在这里并不重要,因为一次只有两个范围,每个范围都有10K长;与参数列表的100米相比,没有什么关系。)

如果您希望它在需要时动态生成值,而不是一次生成所有100米,则需要使用生成器表达式而不是列表理解。这几乎总是把括号变成括号的问题:

代码语言:javascript
运行
复制
x=pool.map(f,((i,j) for i in range(10000) for j in range(10000)))

但是,正如您可以从来源中看到的那样,如果您给map一个生成器,map最终只会列出一个列表,所以在本例中,这不会解决任何问题。(这些文档并没有明确地这样说,但是如果没有长度的…,很难看出它如何挑选一个好的块来分割可迭代的代码)。

而且,即使这不是真的,结果仍然会再次遇到相同的问题,因为pool.map返回一个列表。

要解决这两个问题,您可以使用pool.imap代替。它以惰性的方式消耗可迭代性,并返回结果的惰性迭代器。

需要注意的一点是,如果您不传递一个,imap不会猜测最佳的块大小,而只是默认为1,因此您可能需要一些思考或尝试和错误来优化它。

而且,imap仍然会在一些结果出现时排队,这样就可以按照与参数相同的顺序将它们反馈给您。在病理病例中,结果可能会排队(池大小-1)/poolsize,尽管在实践中这是非常罕见的。如果您想解决这个问题,请使用imap_unordered。如果您需要知道排序,只需将索引与args和结果来回传递:

代码语言:javascript
运行
复制
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)的结果做任何事情。既然如此,为什么还要费心收集结果呢?在这种情况下,您可以回到循环:

代码语言:javascript
运行
复制
for i in range(10000):
    for j in range(10000):
        map.apply_async(f, (i,j))

但是,imap_unordered可能仍然值得使用,因为它提供了一种非常简单的方法来阻止直到完成所有任务,同时仍然让池本身运行以供以后使用:

代码语言:javascript
运行
复制
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)
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18519420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档