84

zip代わりに使用する方が良いのはitertools.izipいつですか?

4

4 に答える 4

101

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_alst_bが非常に大きい場合 (たとえば、数百万のレコード) は、zip(a, b)ダブル スペースを使用して 3 番目のリストを作成します。

ただし、リストが小さい場合は、おそらくzipより高速です。

于 2011-02-14T07:52:45.540 に答える
44

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

于 2011-02-14T07:34:12.887 に答える
5

2.xでは、イテレータの代わりにリストが必要な場合。

于 2011-02-14T07:33:58.660 に答える