はどう違うの範囲xrange機能はPython2.X?
-
01-07-2019 - |
質問
うxrangeは速くなりがわからないから多く寄せられるご質問(証明のほかにミクロなることで速やかさが違う
for i in range(0, 20):
for i in xrange(0, 20):
解決
範囲トのリストを作成しば range(1, 10000000)
でトのリストを作成し、メモリ 9999999
ます。
xrange
はシーケンスオブジェクト評価は、遅延してもかまいません。
だから追加する@Thiagoのヒントここにpython3範囲は同等のチュートリアルではpythonのxrange
他のヒント
範囲トのリストを作成しば
range(1, 10000000)
でトのリストを作成し、メモリ9999999
ます。
xrange
発生させる装置ではシーケンスオブジェクトは評価は、遅延してもかまいません。
これは事実だが、Python3, .range()
実施するにはPython2 .xrange()
.が必要な場合は実際に生み出すもののリストが必要となります:
list(range(1,100))
この利用 timeit
モジュールテストの小片をコードする。
$ python -m timeit 'for i in range(1000000):' ' pass'
10 loops, best of 3: 90.5 msec per loop
$ python -m timeit 'for i in xrange(1000000):' ' pass'
10 loops, best of 3: 51.1 msec per loop
個人的には、私がよく利用す .range()
, ない限り、また対応 本当に 巨大なリストをしていくことができ、時間的には、リスト、百万件、余分なオーバーヘッドのみ0.04秒です。とアルテミーシア湖、Python3.0 .xrange()
からはどんどん遠ざかっていくと .range()
でも反復子の挙動をくれました。
xrange
み店舗の範囲のパラメータを生成するの番号です。しかしCの実装のPython現在の制限その引数をC long値:
xrange(2**32-1, 2**32+1) # When long is 32 bits, OverflowError: Python int too large to convert to C long
range(2**32-1, 2**32+1) # OK --> [4294967295L, 4294967296L]
るということに注意してくださPython3.0に限りあり range
そのように動作する2.x xrange
可能な限り最高の性能と柔軟性を最小および最終了ます。
xrange反復子を返しまみ保持数をメモリです。範囲の全体のリストの数。
い時間の 図書館レファレンス.をより身近なまでのスピードが速くなりますので,質問の答。特に重要なのは最初の数章で約が組み込みオブジェや種類です。
の利点をxrangeタイプがあるというxrangeオブジェクトは常に 同じ量のメモリなサイズの範囲でスを表しています。ありませんして、終始一貫して利点があります。
別の言い方を見つ迅速に関する情報は、Pythonの構築のdocstringのヘルプ機能:
print xrange.__doc__ # def doc(x): print x.__doc__ is super useful
help(xrange)
範囲トのリストを作成しない範囲(1,10000000)でトのリストを作成し、メモリ10000000ます。xrange発生させる装置での評価は、遅延してもかまいません。
このお二つのメリット:
- できる繰り返し処理を実行しなリストを得ることなく
MemoryError
. - で解決各号の遅延た場合、停止の繰り返し早い時間のトします。
私は衝撃を受け誰も読む doc:
この機能は非常に類似
range()
, ものを返します。xrange
オブジェクトの代わりにリストアップしました。この不透明なシーケンス型なるのと同じ値に対応するリストでなく実際に保存した。の活用xrange()
以上range()
は最小限以降xrange()
まだ作成の価値観があって)場合を除き非常に大きな範囲での使用メモリ待機すべての範囲の要素を利用したことのないなどのループは、通常終了したbreak
).
このために最適化。
range()はリストを作成するの値がstartからend(0..20ごします。このことになるとコストの高い動作に非常に大きい。
xrange()一方は最適化された.でのみ計算する次の値を必要なとき(通xrangeシーケンスオブジェクト)を生じさせるものではありませんのリスト全ての値ような範囲)。
すぐに活用 xrange
以上 range
この簡単な例:
import timeit
t1 = timeit.default_timer()
a = 0
for i in xrange(1, 100000000):
pass
t2 = timeit.default_timer()
print "time taken: ", (t2-t1) # 4.49153590202 seconds
t1 = timeit.default_timer()
a = 0
for i in range(1, 100000000):
pass
t2 = timeit.default_timer()
print "time taken: ", (t2-t1) # 7.04547905922 seconds
上記の例では反映されないもの大幅ない場合 xrange
.
さらに、以下の場合 range
でも遅いので、比 xrange
.
import timeit
t1 = timeit.default_timer()
a = 0
for i in xrange(1, 100000000):
if i == 10000:
break
t2 = timeit.default_timer()
print "time taken: ", (t2-t1) # 0.000764846801758 seconds
t1 = timeit.default_timer()
a = 0
for i in range(1, 100000000):
if i == 10000:
break
t2 = timeit.default_timer()
print "time taken: ", (t2-t1) # 2.78506207466 seconds
と range
, で既に作成リストは0から100000000(時間のかかるもの xrange
発生させる装置で発生数に基づくものである場合、繰り返し処理が続きます。
Python-3の実施 range
機能性と同じです xrange
Python-2ないとともに xrange
Python-3
嬉しい符号化!!
範囲): 範囲(1日10)リストを返しますから1から10までの番号-開催リスト。
xrange(): のように範囲()で返すリストを返すオブジェクトを生成するの範囲の数です。プ、軽くよりも早く範囲()以上のメモリ効率的です。xrange()オブジェクトのように繰り返し処理する反復子を生成するのです。(怠け者の評価)
In [1]: range(1,10)
Out[1]: [1, 2, 3, 4, 5, 6, 7, 8, 9]
In [2]: xrange(10)
Out[2]: xrange(10)
In [3]: print xrange.__doc__
xrange([start,] stop[, step]) -> xrange object
range(x,y)
リストを返します各号の間にx、yをご利用の場合 for
ループ、 range
が遅くなります。実際、 range
が大きくな指標です。 range(x.y)
のまま印刷してリストのすべての数字の間にxとyの
xrange(x,y)
を返します xrange(x,y)
ものを使用した場合には for
ループ、 xrange
が高速化されました。 xrange
が少ないの指数です。 xrange
だけでなく印刷 xrange(x,y)
そのすべての番号の中にこもっていると思います。
[In] range(1,10)
[Out] [1, 2, 3, 4, 5, 6, 7, 8, 9]
[In] xrange(1,10)
[Out] xrange(1,10)
をご利用の場合 for
ループですから、それらの作業
[In] for i in range(1,10):
print i
[Out] 1
2
3
4
5
6
7
8
9
[In] for i in xrange(1,10):
print i
[Out] 1
2
3
4
5
6
7
8
9
あまり差はないと思い利用時のループにも差がある場合だけで印刷です!
Python2.x
範囲(x) リストを返すとメモリで作成されたxです。
>>> a = range(5)
>>> a
[0, 1, 2, 3, 4]
xrange(x) を返しますxrangeオブジェクトは発電機objを生成するの番号です。その計算中にループ(怠け者の評価).
プが若干速くしな範囲)以上のメモリ効率的です。
>>> b = xrange(5)
>>> b
xrange(5)
試験範囲に対xrangeループ名を連ねていらっしゃを使えばいいか迷ってい timeit, ここで速やかに不正使用からメモリーを使用し簡単なリスト内包例)からの
import time
for x in range(1, 10):
t = time.time()
[v*10 for v in range(1, 10000)]
print "range: %.4f" % ((time.time()-t)*100)
t = time.time()
[v*10 for v in xrange(1, 10000)]
print "xrange: %.4f" % ((time.time()-t)*100)
る:
$python range_tests.py
range: 0.4273
xrange: 0.3733
range: 0.3881
xrange: 0.3507
range: 0.3712
xrange: 0.3565
range: 0.4031
xrange: 0.3558
range: 0.3714
xrange: 0.3520
range: 0.3834
xrange: 0.3546
range: 0.3717
xrange: 0.3511
range: 0.3745
xrange: 0.3523
range: 0.3858
xrange: 0.3997 <- garbage collection?
または、xrangeのためのループ:
range: 0.4172
xrange: 0.3701
range: 0.3840
xrange: 0.3547
range: 0.3830
xrange: 0.3862 <- garbage collection?
range: 0.4019
xrange: 0.3532
range: 0.3738
xrange: 0.3726
range: 0.3762
xrange: 0.3533
range: 0.3710
xrange: 0.3509
range: 0.3738
xrange: 0.3512
range: 0.3703
xrange: 0.3509
私のスニペットの試験が必要ですか?に対する許容度が遅いインスタンスのxrange?またはより良い例:-)
一部、その他の回答であることPython3に解消2.x range
と改称2.x xrange
へ range
.しかしませんが、利用3.0 3.1(誰もいない)、これは実際とはやや異なるタイプです。
として に3.1docs と言う:
範囲のオブジェクトには非常に少ない行動これは支援を割り出し、繰り返し、
len
機能です。
しかし、3.2+, range
は配列で拡張スライスの方法 collections.abc.Sequence
同じ意味として list
.*
と、少なくともCPythonとPyPyふ3.2+実装は現在存在する)で一定時間の実装を index
や count
方法とは in
オペレーターとして長としてだけでは整数).この文書 123456 in r
はリーズナブルで3.2+、2.7 3.1で思う。
*その issubclass(xrange, collections.Sequence)
を返します True
に2.6-2.7 3.0-3.1が バグ した固定3.2なユーザ情報調査.
xrange()範囲()にpythonの作品同様にして、ユーザーがにをどのように行うか話し合っているメモリの割り当ての使用の両方の機能です。
また使用範囲()をメモリを割り当てのためのすべての変数で生成であるのですが。変数を生成します。
xrange()の生成に特定の値でのみ使用できるためのループに印刷すべての値が必要です。
範囲の全体のリストを返します。xrangeない--が発生する番号の一覧です。
下記をお読みの比較範囲xrangeとグラフィカル解析.
xrangeを使用して反復子を生成値の幅を返します。
どう?
range
を返すstaticリストを行います。
xrange
を返します。 object
(ある行為のように発電機は、あのいくつかの値を生成しております。
するために使用される?
- 使用
xrange
組み込まれていません。リストのための巨大な範囲の、1億円のとき"メモリに敏感なシステム"のように電話が入りました。 - 使用
range
したい場合に対して繰り返し処理を実行する、リストの数。
PS:Python3.x range
機能==Python2.x xrange
機能です。
に要求走査/印刷が0-Nの項目の範囲やxrangeは次のように働きます。
range()-新たに生成しますリストのメモリであり、全体0-N(N+1)および印刷します。xrange()-作成の反復子インスタンスがスキャンを通じての保のた商品をメモリが利用同額の記憶。
場合には、必要な要素は多少のリストの先頭にのみその保存時間でした。
の差で減少し小さいの引数 range(..)
/ xrange(..)
:
$ python -m timeit "for i in xrange(10111):" " for k in range(100):" " pass"
10 loops, best of 3: 59.4 msec per loop
$ python -m timeit "for i in xrange(10111):" " for k in xrange(100):" " pass"
10 loops, best of 3: 46.9 msec per loop
この場合に xrange(100)
の約20%をより効率的です。
皆様について説明しています。がたかったのでもったのは間違いありません。使っていpython3.そこで、オリソースモニター(Windows!), は、第一に、実行され、以下のコマンド:
a=0
for i in range(1,100000):
a=a+i
その後の変更"を使います。では軽微であります。その後、行った以下のコード:
for i in list(range(1,100000)):
a=a+i
で大きなチャンクのメモリ使用します。そして、納得してしまった.試すことができます。
ご利用の場合はPython2倍、そして置き換え'範囲()'を'xrange()の最初のコードリスト(範囲))"と"range()は'.
範囲 を返します リスト ながら xrange を返します。 xrange オブジェクトと同一のメモリにかかわらず、範囲のサイズは、この場合、一つの要素が生成され、配を繰り返し処理が使用する場合範囲を、すべての要素は生で一度にメモリの内容を消去します。
範囲:-範囲の移植ものです。という毎番号の範囲を占めるメモリの内容を消去します。
xrange:-xrangeさんは、この発電機ですが写真で分かるようにしたい数値の範囲がまんして保存するようにしたいときに使用します。でメモリ効率的です。
からのdocsに入ります。
Python2.7.12
>>> print range.__doc__
range(stop) -> list of integers
range(start, stop[, step]) -> list of integers
Return a list containing an arithmetic progression of integers.
range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.
When step is given, it specifies the increment (or decrement).
For example, range(4) returns [0, 1, 2, 3]. The end point is omitted!
These are exactly the valid indices for a list of 4 elements.
>>> print xrange.__doc__
xrange(stop) -> xrange object
xrange(start, stop[, step]) -> xrange object
Like range(), but instead of returning a list, returns an object that
generates the numbers in the range on demand. For looping, this is
slightly faster than range() and more memory efficient.
Python3.5.2
>>> print(range.__doc__)
range(stop) -> range object
range(start, stop[, step]) -> range object
Return an object that produces a sequence of integers from start (inclusive)
to stop (exclusive) by step. range(i, j) produces i, i+1, i+2, ..., j-1.
start defaults to 0, and stop is omitted! range(4) produces 0, 1, 2, 3.
These are exactly the valid indices for a list of 4 elements.
When step is given, it specifies the increment (or decrement).
>>> print(xrange.__doc__)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'xrange' is not defined
差が見られます。Python2.x、 range
リストを返します, xrange
を返しますxrangeオブジェクトがlist.
Python3.x、 range
となり xrange
Python2.x、 xrange
は削除されます。
また、場合せ list(xrange(...))
に相当する range(...)
.
なので list
が遅くなります。
も xrange
良い仕上がりの配列
だから、そのリストでないか xrange
オブジェクト
この ポスト 示差の範囲とxrange:
引用:
range
を返しまうお返事ありがとうございます。:リストの連続 整数、長さが定義されてか0になります。xrange
, しかし、 を返します。 "xrangeオブジェクト", る行為ものように繰り返し処理する反復子