itertools.izip
の代わりに Zip
を使用したほうがよいのはいつですか?
わかっている場合は、アイテムの完全なリストを作成する必要があります(たとえば、そのリストをインプレースで変更する関数に渡すため)。または、特定のポイントで完全に評価されるようにZip()
に渡す引数を強制する場合。
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
_
Zip
を使用すると、サイクルに入る前にall _(a, b)
_のカップルが計算されます。
さらに、_lst_a
_と_lst_b
_が非常に大きい場合(たとえば、数百万件のレコード)、Zip(a, b)
は2番目のスペースを含む3番目のリストを作成します。
ただし、リストが小さい場合は、Zip
の方が高速かもしれません。
2.xでは、needイテレータではなくリスト。
Itertoolsライブラリは、一般的なPython関数。 「イテレータ」。
Pythonイテレータは、通常のメモリ内リストよりもメモリを節約する「遅延ロード」シーケンスです。そのため、2つの入力a、bが大きすぎて一度にメモリに保持できない場合は、itertools.izip(a、b)を使用します。
Python効率的な順次処理に関連する概念:
"generators" & "yield"
"iterators"
"lazy loading"