それらの多くはイテレータではなく、特別なビュー オブジェクトです。たとえば、range() は古い xrange オブジェクトに似たものを返すようになりました。これは引き続きインデックスを作成できますが、必要に応じて整数を遅延構築します。
同様に、 dict.keys() は、キーのコピーで新しいリストを作成するのではなく、辞書のビューを実装する dict_keys オブジェクトを提供します。
これがメモリフットプリントにどのように影響するかは、おそらくプログラムによって異なります。確かに、リストが本当に必要でない限り、イテレータの使用に重点が置かれていますが、リストの使用は一般的に python2 のデフォルトのケースでした。これにより、平均的なプログラムのメモリ効率が向上する可能性があります。ただし、非常に大きなメモリ使用量が目立ち、すでに対処されている可能性が高いため、非常に大きな節約がある場合は、python2 プログラムのイテレータとして既に実装されている可能性があります。file.readlines()
(例: ファイル反復子は、以前の方法よりもはるかにメモリ効率が高い)
変換は 2to3 ツールによって行われ、通常は range() のようなものを、実際のリストが不要であると安全に判断できる反復子に変換します。そのため、次のようなコードを作成します。
for x in range(10): print x
新しい range() オブジェクトに切り替わり、リストを作成しなくなるため、メモリの利点が減少しますが、コードは次のようになります。
x = range(20)
次のように変換されます。
x = list(range(20))
コンバーターは、コードが x に実際のリスト オブジェクトを期待しているかどうかを判断できないためです。