zip
代わりに使用する方が良いのはitertools.izip
いつですか?
zip
関数はPython2の関数ですizip
。一般に、Python 3は、範囲、フィルター、dict関数などのイテレーターを使用するようにほとんどの関数を変更しました
zip
代わりに使用する方が良いのはitertools.izip
いつですか?
zip
関数はPython2の関数ですizip
。一般に、Python 3は、範囲、フィルター、dict関数などのイテレーターを使用するようにほとんどの関数を変更しました
回答:
アイテムの完全なリストを作成する必要があることがわかっている場合(たとえば、そのリストをインプレースで変更する関数に渡すため)。または、渡す引数をzip()
その特定のポイントで完全に評価するように強制したい場合。
izip
たtuple
場合にのみ再利用するtuple
ため、何も得られません。とは言うものの、損失も些細なことなので、必要に応じてizip
ラッピングしてlist
、排他的に使用しない理由はほとんどないことに同意しますlist
。実際には、from future_builtins import zip
Py2コードに追加することで、これを「適切な」方法で行うことができます。これによりzip
、izip
(Py3遷移の準備)がわかりやすくなります。
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
すると、サイクルに入る前にすべての (a, b)
カップルが計算されます。
さらに、lst_a
とlst_b
が非常に大きい場合(たとえば、数百万のレコード)、zip(a, b)
2倍のスペースを持つ3番目のリストを作成します。
ただし、リストが小さい場合は、おそらくzip
高速です。
itertoolsライブラリは、一般的なPython関数の「イテレータ」を提供します。itertoolsのドキュメントから、「リストの代わりにイテレータを返すことを除いて、zip()と同様です。」izip()のIは「イテレータ」を意味します。
Pythonイテレータは、通常のメモリ内リストよりもメモリを節約する「遅延読み込み」シーケンスです。したがって、2つの入力a、bが大きすぎて一度にメモリに保持できない場合は、itertools.izip(a、b)を使用します。
効率的な順次処理に関連するPythonの概念を調べます。
"generators" & "yield"
"iterators"
"lazy loading"
2.xでは、イテレータの代わりにリストが必要な場合。
itertools.izip()
ゲインが純粋に統計的である場合を除いて、私が好む傾向があるのはそのためです。
lst = zip(lst_a, lst_b)
許可lst[1]
またはlen(lst)
。ただし、またはをilst = itertools.izip(lst_a, lst_n)
実行しようとすると失敗します。ilst[1]
len(ilst)
zip
あまりにも明白であるがまだ指摘する価値があることを支持する1つの理由は、一度だけトラバースできるをizip
返すiterator
ことです。つまり、ii = izip(a,b) ; f(ii) ; g(ii)
では、ここでは空のリスト[]
がに渡されg
ます。