1. ホーム
  2. パイソン

[解決済み】range()よりもxrange()を常に優先すべきなのか?)

2022-03-24 02:30:02

質問

なぜ、またはなぜそうしないのですか?

解決方法は?

パフォーマンスのため、特に大きな範囲に対して反復処理を行う場合。 xrange() は通常、より良いものです。 しかし、いくつかのケースでは range() :

  • python3では。 range() が行うのは xrange() を使用し xrange() は存在しない。 Python 2 と Python 3 の両方で動作するコードを書きたい場合、Python 2 と Python 3 の両方で動作するコードを書きたい場合、Python 2 と Python 3 の両方で動作するコードを書きたい場合は xrange() .

  • range() は、同じシーケンスを何度も繰り返す場合など、実際に速くなることがあります。 xrange() は毎回整数オブジェクトを再構築しなければなりませんが range() は実整数オブジェクトを持つことになります。 (ただし、メモリの面では常にパフォーマンスが悪くなります)。

  • xrange() は、本当のリストが必要なすべてのケースで使えるわけではありません。 例えば、スライスやリストメソッドをサポートしていません。

[編集] このサイトでは range() は、2to3ツールによってアップグレードされます。 念のため、以下は、2to3ツールのサンプル使用例でツールを実行したときの出力です。 range()xrange()

RefactoringTool: Skipping implicit fixer: buffer
RefactoringTool: Skipping implicit fixer: idioms
RefactoringTool: Skipping implicit fixer: ws_comma
--- range_test.py (original)
+++ range_test.py (refactored)
@@ -1,7 +1,7 @@

 for x in range(20):
-    a=range(20)
+    a=list(range(20))
     b=list(range(20))
     c=[x for x in range(20)]
     d=(x for x in range(20))
-    e=xrange(20)
+    e=range(20)

このように、forループや内包の中で使われたり、すでにlist()でラップされている場合、範囲は変更されないままです。