gpt4 book ai didi

python - 在什么情况下我们需要使用 `multiprocessing.Pool.imap_unordered` ?

转载 作者:IT老高 更新时间:2023-10-28 20:39:01 26 4
gpt4 key购买 nike

imap_unordered 返回的迭代器的结果排序是任意的,而且它似乎并不比 imap 运行得快(我用以下代码检查) ,那么为什么要使用这种方法呢?

from multiprocessing import Pool
import time

def square(i):
time.sleep(0.01)
return i ** 2

p = Pool(4)
nums = range(50)

start = time.time()
print 'Using imap'
for i in p.imap(square, nums):
pass
print 'Time elapsed: %s' % (time.time() - start)

start = time.time()
print 'Using imap_unordered'
for i in p.imap_unordered(square, nums):
pass
print 'Time elapsed: %s' % (time.time() - start)

最佳答案

使用 pool.imap_unordered 而不是 pool.imap 不会对代码的总运行时间产生很大影响。它可能会快一点,但不会太多。

然而,它可以做的是使迭代中可用的值之间的间隔更加均匀。也就是说,如果您的操作可能需要非常不同的时间(而不是您在示例中使用的一致的 0.01 秒),则 imap_unordered 可以通过在计算较慢的值之前产生计算较快的值。常规的 imap 将延迟产生较快的,直到它们前面的较慢的已经计算出来(但这不会延迟工作进程继续进行更多计算,只是让您看到它们的时间)。

尝试让你的工作函数休眠 i*0.1 秒,打乱你的输入列表并在你的循环中打印 i。您将能够看到两个 imap 版本之间的区别。这是我的版本(main 函数和 if __name__ == '__main__' 样板是在 Windows 上正确运行所必需的):

from multiprocessing import Pool
import time
import random

def work(i):
time.sleep(0.1*i)
return i

def main():
p = Pool(4)
nums = range(50)
random.shuffle(nums)

start = time.time()
print 'Using imap'
for i in p.imap(work, nums):
print i
print 'Time elapsed: %s' % (time.time() - start)

start = time.time()
print 'Using imap_unordered'
for i in p.imap_unordered(work, nums):
print i
print 'Time elapsed: %s' % (time.time() - start)

if __name__ == "__main__":
main()

imap 版本在处理像 49 这样的值时会有很长的停顿(需要 4.9 秒),然后它会飞越一堆其他值(这些值是由其他进程计算的,而我们正在等待处理 49)。相比之下,imap_unordered 循环通常不会一次暂停那么长时间。它将有更频繁但更短的停顿,并且其输出将趋于平滑。

关于python - 在什么情况下我们需要使用 `multiprocessing.Pool.imap_unordered` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19063238/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com