有没有办法让每个循环并行?

时间:2010-07-12 14:44:12

标签: python foreach iteration parallel-processing

假设我在Python中有2个列表,我希望并行遍历每个列表 - 例如对两个列表执行元素1操作,对两个列表执行元素2操作...我知道我可以通过使用索引来执行此操作:

for listIndex in range(len(list1)):
   doSomething(list1[listIndex])
   doSomething(list2[listIndex])

但是有没有办法通过foreach循环更直观地做到这一点?像for list1Value in list1, list2Value in list2 ......?

之类的东西

我目前在Python中遇到过这种情况,但这是一个长期存在的问题,我很想知道你是否可以用任何语言做到这一点。 (我只是假设Python最有可能有一种方法来解决这个问题。)

3 个答案:

答案 0 :(得分:14)

这样的东西?

for (a,b) in zip(list1, list2):
  doSomething(a)
  doSomething(b)

虽然如果doSomething()没有进行I / O或更新全局状态,并且它一次只对其中一个元素起作用,顺序无关紧要,所以你可以使用{{1} }(来自itertools):

chain()

Apropos,for x in chain(list1, list2): doSomething(x) 是我经常做的事情。考虑from itertools import *而不是使用我上面提到的izip()。另请查看zip()izip_longest()等。欢迎使用函数式编程。 : - )

哦,压缩也适用于更多“列”:

izip(count(), lst)

答案 1 :(得分:4)

这取决于语言。 Python实际上有一个相当简单的方法:

a = (0,1,2,3,4,5,6,7,8,9)
b = "ABCDEFGHIJ"
for pair in zip(a,b):
  print("%d => %s" % pair)

答案 2 :(得分:4)

使用zipitertools.izip

for item1, item2 in zip(iterable1, iterable2):
    # process the items in parallel
Python中的

itertools.izip< Python中的3和zip≥3返回迭代器;即根据要求他们提供成对的元组(或三元组,四重奏等)。 Python< 3 zip创建一个元组列表,因此如果最小的序列很长,内存需求可能很大。