web-dev-qa-db-ja.com

izipの代わりにZipを使用したほうがよいのはいつですか?

itertools.izip の代わりに Zip を使用したほうがよいのはいつですか?

72
Neil G

わかっている場合は、アイテムの完全なリストを作成する必要があります(たとえば、そのリストをインプレースで変更する関数に渡すため)。または、特定のポイントで完全に評価されるようにZip()に渡す引数を強制する場合。

39
Amber

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の方が高速かもしれません。

91
Dona

2.xでは、needイテレータではなくリスト。

Itertoolsライブラリは、一般的なPython関数。 「イテレータ」。

Pythonイテレータは、通常のメモリ内リストよりもメモリを節約する「遅延ロード」シーケンスです。そのため、2つの入力a、bが大きすぎて一度にメモリに保持できない場合は、itertools.izip(a、b)を使用します。

Python効率的な順次処理に関連する概念:

"generators" & "yield"
"iterators"
"lazy loading"
5
Sakib Ahammed