リストではなくイテレータを返すことによってPy3kメモリの節約
-
22-08-2019 - |
質問
はPython 2.xの中でリストを返すために使用される多くの方法が今Py3kでイテレータを返すように見える。
また、ジェネレータ式イテレータはありますか?遅延評価?
このように、これとのpythonのメモリフットプリントを大幅に削減する予定です。それはないですか?
どのような組み込みスクリプトを使用して2to3はから変換プログラムのでしょうか?
組み込みツールは、明示的に互換性のために、リストにすべて返されたイテレータを変換していますか?そうならば、Py3kの低メモリフットプリントの利点は、変換プログラムでは、実際には明白ではありません。それはありますか?
解決
彼らの多くは正確にイテレータが、特別なビューオブジェクトではありません。それはまだインデックスを作成することができますが、必要に応じて遅延した整数を構築する。
- )(例えば範囲のために今、古いはxrangeオブジェクトに似たものを返します。同様dict.keys()dict_keysはなくキーのコピーを使用して新しいリストを作成するよりも、辞書上のビューを実装するオブジェクトが得られる。
これはどのようにプログラムに依存し、おそらくメモリフットプリントに影響を与えます。リストを使用すると、一般的にpython2のデフォルトのケースだったのに対し、あなたは本当に、リストを必要としない限り、確かにイテレータを使用した方の重点の多くのがあります。これは平均的なプログラムは、おそらくより多くのメモリ効率的になります。本当に大きな貯蓄があるケースは、おそらく非常に大きなメモリ使用量が頭角を現すだろうとして、すでに、しかしpython2プログラムでイテレータとして実装することになるだろう、とすでに対処される可能性が高いされています。
(例。ファイルイテレータはすでに古いfile.readlines()
方法よりもはるかに多くのメモリが効率的です)
2to3はツールによって行われる変換、および一般的範囲(のようなものを変換します)、それは安全に必要とされていない本当のリストを決定することができますイテレータに、そのようなコード:
for x in range(10): print x
は、もはやリストを作成し、これ低下メモリ利益を得るであろうが、コードように、新しい範囲()オブジェクトに切り替えないであろう
x = range(20)
のように変換されます。
x = list(range(20))
コードはxのの本当ののリストオブジェクトを想定した場合、コンバータとして知ることはできません。
他のヒント
また、ジェネレータ式イテレータはありますか?遅延評価?
イテレータは、次のメソッドを持つだけの目的です。どのような関数がイテレータを返すと言ったときにドキュメントがほとんどの時間を意味すると、その結果が遅延ロードであるということです。
このように、これとのpythonのメモリフットプリントを大幅に削減する予定です。それはないですか?
これは依存しています。私は平均的なプログラムはいえ、の巨大なの違いに気付くことはないだろうと推測すると思います。リストの上にイテレータのパフォーマンス上の利点は、あなたが大規模なデータセットを持っている場合、実際には重要です。あなたはこの質問を確認したいことがあります。
リストの上にイテレータの最大の利点の一つは、メモリではない、それは実際に計算時間です。例えば、Pythonの2
for i in range(1000000): # spend a bunch of time making a big list
if i == 0:
break # Building the list was a waste since we only looped once
さて、たとえばかかります:
for i in xrange(1000000): # starts loop almost immediately
if i == 0:
break # we did't waste time even if we break early
例は不自然ではあるが、、ユースケースではありません。ループは、多くの場合、途中の外に壊れています。あなたが複数回、それを使用しようとしている場合を除き、それだけの使用部分にリスト全体を構築することは無駄です。 r = list(range(100))
:その場合は、明示的にリストを作成することができます。イテレータは、Python 3でより多くの場所にデフォルトされている理由です。あなたが必要とするとき、あなたはまだ明示的にリスト(または他の容器)を作成することができますので、あなたは何も出ません。しかし、あなたがする予定のすべてを一度反復可能を反復したとき、あなたはに強制されていない(私が主張するだろうどのくらいのより一般的なケースです)。