itertools.izip
の代わりにzip
を使用する方が良いでしょうか?izipの代わりにzipを使用する方が良いのはいつですか?
答えて
あなたが知っているなら、(たとえば、そのリストをその場で変更する関数に渡すために)構成されたアイテムの完全なリストが必要な場合は、または、あなたが渡している引数を強制的に特定のポイントで完全に評価されるようにする場合は、zip()
にしてください。
タプルを再利用し、izipを使用しない本当の理由がないので、最初のケースではizipを高速化する方がよいでしょうか? – user1815201
@ user1815201: 'izip'は、' tuple'が次の反復が始まる前に解放された場合にのみ 'tuple'を再利用するので、何も得られません。つまり、どんな損失も簡単なので、 'izip'を排他的に使用しない理由はほとんどないことに同意します。' list'が必要な場合は 'list'で折り返します。 Pythonコードに 'future_builtins import zip'を追加することで、これを実際に「適切な」方法で実行できます。これによりPythonの移行に備えて' zip'が 'izip'になります。 – ShadowRanger
2.xでは、には、イテレータの代わりにリストが必要です。
これが起こるかもしれない例を教えてもらえますか? –
本当にありません。だからこそ私はitertools.izip()を好む傾向がありますが、利益は純粋に統計的なものになります。 –
1つのケースでは、リストが必要な場合は、結果の項目にインデックスでアクセスするか、または全長を検索する必要がある場合です。 'lst = zip(lst_a、lst_b)'は 'lst [1]'または 'len(lst)'を許可します。しかし、 'ilst = itertools.izip(lst_a、lst_n)'の場合、 'ilst [1]'や 'len(ilst)'に失敗するでしょう。 –
zip
はすべてのリストを一度に計算し、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
:
一つの重要な違いは、「izip」はリストではなく、(例えば、インデックス作成など)は、リスト固有の機能をサポートしていない「izipオブジェクト」を返し、「ZIP」は実際のリストを返すことです
リスト(リストのようなオブジェクトではない)が必要な場合は、単に「zip」を使用してください。
これ以外にも、 'izip'はメモリやサイクルを節約するのに役立ちます。
など。次のコードは、数サイクル後に出ることができるので、組み合わせリストのすべての項目を計算する必要はありません:zip
を使用して
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
はサイクルに入る前にすべて(a, b)
カップルを計算しているだろう。
さらに、lst_a
とlst_b
が非常に大きい場合(たとえば、何百万というレコードの場合)、zip(a, b)
は二重のスペースを持つ3番目のリストを作成します。
しかし、小さなリストがある場合は、おそらくzip
が高速です。
ありがとうございます。しかし、これは主に 'izip'が' zip'よりも優れていると答えます。 –
あなたは正しいです。私は良い意思で始め、理論的なものに落ちた。 – Don
itertoolsライブラリは、一般的なPython関数の「イテレータ」を提供します。 itertoolsドキュメントから、 "リストの代わりにイテレータを返す以外はzip()と似ています。" izip()中のIは「反復子」を意味します。
Pythonイテレータは、通常のメモリ内リストよりもメモリを節約する「遅延ロード」シーケンスです。したがって、2つの入力a、bが大きすぎて一度にメモリに保持できない場合は、itertools.izip(a、b)を使用します。
は、効率的な逐次処理に関連するPythonの概念を見上げて:指摘する価値はまだ、まだあまりにも明白zip` `賛成の
"generators" & "yield"
"iterators"
"lazy loading"
きちんと説明した。 –
- 1. データバインディングの代わりにDataTriggerを使用する方が良いですか?
- 2. 継承の代わりにテンプレートを使用するのはいつですか?
- 3. 次のケースで割り込みの代わりにisInterruptedを使用する方が良いでしょう
- 4. parseIntの代わりにビット演算子を使用しないのが良い理由はありますか?
- 5. whileループの代わりにセマフォを使用する。これは良いか悪いですか?
- 6. デカップリングにインターフェイスの代わりにデリゲートを使用する。良いアイデア?
- 7. Android Java:これはenumsの代わりに良い方法ですか?
- 8. デフォルトのRailsスキャフォールディングスタイルシートの代わりに、より良い方法:scaffold.css?
- 9. JSONFieldの代わりにHStoreFieldを使用する必要があるのはいつですか?
- 10. GETの代わりにPOSTを使用すると良いことはありますか?
- 11. 分岐コードの代わりに機能トグリングとIoCを使用する - 良いか悪いのか?
- 12. Scalaの戦略パターンの代わりの方が良いでしょうか?
- 13. マルチスレッドの代わりにメッセージング(JMSなど)はいつですか?
- 14. ReSharperの代わりに、常に1が良いの文字列
- 15. Kubernetesでは、configmapの代わりに秘密を使用するのはいつですか?
- 16. VSSの代わりにVS2005と2008の良い代替ソースコントロール
- 17. MVCアプリケーション用のAPIを設計するときは、パラメータリストの代わりに配列を使用する方が良いですか?
- 18. MySQLの代わりにJSONを使用していますか?
- 19. セレクタの代わりにブロックオブジェクトを使用していますか?
- 20. Captchaの代わりにReferrerを使用していますか?
- 21. urllib.request.urlretrieveの代わりに使用するコマンドは何ですか?
- 22. key_nameの代わりにdatastore idを使用する方法は?
- 23. SyncEngineの代わりにAsyncHttpを使用する方法は?
- 24. executorThreadsPoolの代わりにjavaパラレルストリームを使用する方法は?
- 25. getterの代わりにivar変数を使用する利点について
- 26. PHPのSOAP拡張に代わる良い選択肢がありますか?
- 27. jarの代わりにzipを検索する
- 28. Android:いつ/なぜフラグメントの代わりにFrameLayoutを使用する必要がありますか?
- 29. いつUIImagePickerControllerSourceTypeSavedPhotosAlbumの代わりにUIImagePickerControllerSourceTypePhotoLibraryを使用する必要がありますか?
- 30. iphoneでCommonCryptoの代わりに使用する方法は何ですか?
一つの理由は、' izip'がどのできる 'iterator'を返すということです一回だけ横断されます。すなわち、「ii = izip(a、b)」である。 f(ii); g(ii) '、ここで空のリスト' [] 'が' g 'に渡されます。 – Causality