zip
代わりに使用する方が良いのはitertools.izip
いつですか?
4 に答える
zip
一度にすべてのリストをizip
計算し、要求されたときにのみ要素を計算します。
重要な違いの 1 つは、「zip」は実際のリストを返し、「izip」は「izip オブジェクト」を返すことです。これはリストではなく、リスト固有の機能 (インデックス作成など) をサポートしていません。
>>> l1 = [1, 2, 3, 4, 5, 6]
>>> l2 = [2, 3, 4, 5, 6, 7]
>>> z = zip(l1, l2)
>>> iz = izip(l1, l2)
>>> isinstance(zip(l1, l2), list)
True
>>> isinstance(izip(l1, l2), list)
False
>>> z[::2] #Get odd places
[(1, 2), (3, 4), (5, 6)]
>>> iz[::2] #Same with izip
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'itertools.izip' object is unsubscriptable
したがって、リスト (リストのようなオブジェクトではない) が必要な場合は、'zip' を使用してください。
これとは別に、「izip」はメモリやサイクルを節約するのに役立ちます。
たとえば、次のコードは数サイクル後に終了する可能性があるため、結合されたリストのすべての項目を計算する必要はありません:
lst_a = ... #list with very large number of items
lst_b = ... #list with very large number of items
#At each cycle, the next couple is provided
for a, b in izip(lst_a, lst_b):
if a == b:
break
print a
usingは、サイクルに入る前にすべてのカップルzip
を計算します。 (a, b)
さらに、lst_a
とlst_b
が非常に大きい場合 (たとえば、数百万のレコード) は、zip(a, b)
ダブル スペースを使用して 3 番目のリストを作成します。
ただし、リストが小さい場合は、おそらくzip
より高速です。
アイテムの完全なリストを作成する必要があることがわかっている場合(たとえば、そのリストをインプレースで変更する関数に渡すため)。または、渡す引数をzip()
その特定のポイントで完全に評価するように強制したい場合。
2.xでは、イテレータの代わりにリストが必要な場合。