如何在Python中迭代两个列表?我想要完全的结果
list1, list2, list3 = [0, 1], ['a', 'b'], [2, 3] # example data for item in list1 + list2 + list3: print(item)
但我认为添加列表然后迭代它们并不高效.我使用for
循环遍历列表:
for list_ in (list1, list2, list3): for item in list_: print(item)
但是当我检查这个timeit
时,两者的执行时间非常相似.
有可能让它更快吗?
对于小型数据集,您将找不到太多差异.但通常如果你想链接和迭代多个迭代,那么你可以itertools.chain
像这样使用
>>> list1, list2, list3 = [0, 1], ['a', 'b'], [2, 3] >>> from itertools import chain >>> for item in chain(list1, list2, list3): ... print(item) 0 1 a b 2 3
这不会创建任何中间数据结构并逐个迭代每个迭代.返回的值chain
是迭代器.所以这也不会创建一个包含所有项目的容器,如果迭代会非常大,那么它的内存效率非常高.
并且itertools.chain
实际上与您的第二种方法相同.引用官方文档中的等效实现
def chain(*iterables): # chain('ABC', 'DEF') --> A B C D E F for it in iterables: for element in it: yield element
如果我们查看为您显示的第一个程序生成的字节代码,请使用此代码
from dis import dis list1, list2, list3 = [0, 1], ['a', 'b'], [2, 3] def func(): for item in list1 + list2 + list3: print(item) dis(func)
它会是这样的
6 0 SETUP_LOOP 27 (to 30) 3 LOAD_GLOBAL 0 (list1) 6 LOAD_GLOBAL 1 (list2) 9 BINARY_ADD 10 LOAD_GLOBAL 2 (list3) 13 BINARY_ADD 14 GET_ITER >> 15 FOR_ITER 11 (to 29) 18 STORE_FAST 0 (item) 7 21 LOAD_FAST 0 (item) 24 PRINT_ITEM 25 PRINT_NEWLINE 26 JUMP_ABSOLUTE 15 >> 29 POP_BLOCK >> 30 LOAD_CONST 0 (None) 33 RETURN_VALUE
如您所见,BINARY_ADD
代码使用了两次.这意味着首先添加list1
并list2
添加一个临时列表,并再次添加list3
.如果任何列表非常大,这将是非常低效的.