source

Python 2.X의 범위와 xrange 함수의 차이점은 무엇입니까?

manysource 2023. 1. 27. 21:22

Python 2.X의 범위와 xrange 함수의 차이점은 무엇입니까?

xrange가 더 빠른 것 같습니다만, 왜 더 빠른지(또한 지금까지의 일화 외에 더 빠르다는 증거는 없습니다) 또는 그 외에 무엇이 다른지 알 수 없습니다.

for i in range(0, 20):
for i in xrange(0, 20):

Python 2.x의 경우:

  • range에, 「」를 는,range(1, 10000000) 해서 .9999999★★★★★★★★★★★★★★★★★★.

  • xrange는 게으르게 평가되는 시퀀스 객체입니다.

Python 3의 경우:

  • range의 Python 2와 한 기능을 하고 ?xrange으로 사용하셔야 합니다.list(range(...)).
  • xrange더 이상 존재하지 않습니다.

되므로 range를 하면 리스트가 생성됩니다.그러면range(1, 10000000) 해서 .9999999★★★★★★★★★★★★★★★★★★.

xrange 는 제너레이터이기 때문에 시퀀스 오브젝트가 게으르게 평가되는a 입니다.

사실이지만, 3에서는, 「」 「3」range() 2 Python 2에 됩니다.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()시간적으로 볼 때 100만 엔트리의 리스트에 대해 매우 큰 리스트를 다루지 않는 한 추가 오버헤드는 0.04초밖에 되지 않습니다.Corey가 지적했듯이 Python 3.0에서는xrange()range()어쨌든 좋은 반복자 행동을 하게 될 거야

xrange는 범위 파라미터만 저장하고 필요에 따라 숫자를 생성합니다.Python C arg C longs 。

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]

3에는 Python 3.0만 합니다.range2.x로 은 2.x로 동작합니다.xrange단, 최소 및 최대 엔드 포인트에 대한 제한은 없습니다.

xrange는 반복기를 반환하고 한 번에 하나의 숫자만 메모리에 저장합니다.range를 지정하면 번호 목록 전체가 메모리에 저장됩니다.

Library Reference와 함께 시간을 보내십시오.익숙해질수록 이런 질문에 대한 답을 더 빨리 찾을 수 있습니다.특히 중요한 것은 기본 제공 개체와 유형에 대한 첫 번째 몇 장입니다.

xrange 타입의 장점은 xrange 오브젝트가 나타내는 범위의 크기에 관계없이 항상 같은 양의 메모리를 사용한다는 것입니다.일관된 성능상의 이점은 없습니다.

Python 구조에 대한 빠른 정보를 찾는 또 다른 방법은 docstring과 help-function입니다.

print xrange.__doc__ # def doc(x): print x.__doc__ is super useful
help(xrange)

문서에는 명확하게 다음과 같이 기재되어 있습니다.

이 기능은 다음과 매우 유사합니다.range(), 「」, 「」는 xrange목록 대신 오브젝트를 지정합니다.이것은 모든 것을 동시에 저장하지 않고 해당 목록과 동일한 값을 생성하는 불투명한 시퀀스 유형입니다.xrange()에 걸쳐서range()로)xrange() 교환 큰되지 않는 를 들어 "로 되는 경우)를 제외하고가 있습니다.break를 참조해 주세요.

하다 보면 이 있어요.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 is느 is너 to to 느 to is is is is 。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 ~ 소비)의 하고 있습니다만, 0 ~100000000(시간 소비)의 리스트는 작성되고 있습니다.xrange는 제너레이터로, 필요에 따라서만, 즉 반복이 계속 되는 경우에만 숫자를 생성합니다.

Python-3의 rangexrangePython-2는 폐지되었지만 Python-2는 되었습니다.xrange

해피 코딩!!

range는 목록을 작성하기 때문에 range(1,10000000)를 실행하면 10000000 요소를 포함한 목록이 메모리에 작성됩니다.xrange는 제너레이터이기 때문에 느긋하게 평가됩니다.

이를 통해 두 가지 이점이 있습니다.

  1. 긴 할 수 .MemoryError.
  2. 각 번호를 쉽게 해결할 수 있기 때문에 반복을 조기에 중지하면 전체 목록을 작성하는 데 시간을 낭비하지 않습니다.

최적화를 위해서입니다.

range()는 처음부터 끝까지 값 목록을 작성합니다(예에서는 0 . 20 ) 。이것은 매우 넓은 범위에서 비용이 많이 드는 작업이 될 것이다.

반면 xrange()는 훨씬 더 최적화되어 있습니다.필요한 경우에만 다음 값이 계산되며(xrange 시퀀스 객체를 통해) range()와 같이 모든 값의 목록은 작성되지 않습니다.

range(): range(1, 10)는 1~10의 번호의 목록을 반환하고 전체 목록을 메모리에 저장합니다.

xrange(): range()와 비슷하지만 목록을 반환하는 대신 요청 시 범위 내의 번호를 생성하는 개체를 반환합니다.루프의 경우 range()보다 약간 빠르고 메모리 효율이 높습니다.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의 각 하는데, x와 는 x와 y의 입니다.forloop,그 다음에 「」를 합니다.range, 맞다. 사실은요.range의 인덱스 범위가 더 넓습니다. range(x.y)와 yx 사이의 합니다.

xrange(x,y)xrange(x,y), ,, 용, 했을 사용했을 forloop,그 다음에 「」를 합니다.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

루프를 사용할 때는 별로 차이가 없지만 인쇄만 하면 차이가 있습니다!

중이 2.다를 하고 있다.range의 2.x의 했습니다.xrange로로 합니다.range다만, 3.0이나 3.1(아무도 사용할 수 없음)을 사용하고 있지 않는 한, 실제로는 조금 다른 타입이 다릅니다.

3.1 문서에서는 다음과 같이 기술하고 있습니다.

이 거의 반복,및의합니다.「 」, 「 。len★★★★★★ 。

3.2에서는, 「」, 3.2 「」의range완전 시퀀스입니다.확장 슬라이스를 지원하며,의 모든 메서드에는list를 클릭합니다.*

과 PyPy 존재하는 한 3.2+에서는 CPython의 PyPy(CPython은 3.2+ 구현)가.index ★★★★★★★★★★★★★★★★★」count 및 ""in을 사용하다은 ''라고 쓴다는 뜻입니다.123456 in r.2 2. 3.이 됩니다.3.2+는, 2.7은 3.1로 되어 있습니다.


* *issubclass(xrange, collections.Sequence)True2.6-2.7 및 3.0-3.1에서는 3.2에서 수정되어 백포트되지 않은 버그입니다.

python 2.x의 경우

range(x)는 x개의 요소가 있는 메모리에 작성된 목록을 반환합니다.

>>> a = range(5)
>>> a
[0, 1, 2, 3, 4]

xrange(x)는 필요에 따라 숫자를 생성하는 제너레이터 obj인 xrange 개체를 반환합니다.for-loop(Lazy Evaluation) 동안 계산됩니다.

루프의 경우 range()보다 약간 빠르고 메모리 효율이 높습니다.

>>> b = xrange(5)
>>> b
xrange(5)

루프내의 xrange에 대해서 레인지를 테스트했을 때(타임잇을 사용해야 한다는 것을 알고 있습니다만, 이것은 간단한 리스트 이해 예를 사용해 메모리에서 재빠르게 해킹되었습니다) 다음과 같은 것을 알았습니다.

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?

또는 for 루프에서 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 인스턴스에 대한 코멘트는?또는 더 좋은 예:-)

python의 xrange()와 range()는 사용자와 동일하게 동작하지만 두 함수를 모두 사용하여 메모리를 할당하는 방법에 대해 설명할 때 차이가 발생합니다.

range()를 사용하는 경우 생성되는 모든 변수에 메모리를 할당하므로 생성되는 변수의 수가 더 큰 경우에는 사용하지 않는 것이 좋습니다.

한편 xrange()는 한 번에 특정 값만 생성하며 필요한 모든 값을 출력하기 위해 for 루프에서만 사용할 수 있습니다.

range는 목록 전체를 생성하여 반환합니다.xrange does not - 요청 시 목록의 번호를 생성합니다.

xrange는 반복기(플라이의 값)를 사용하고 range는 목록을 반환합니다.


range을 사용하다
xrangeobject(확실히 하나의 생성기는 아니지만) 생성기와 같이 작동하며, 값이 필요할 때 생성됩니다.

언제 사용할까요?

  • xrange만약 당신이 거대한 범위의 목록을 만들고 싶다면, 예를 들어 10억, 특히 당신이 휴대폰과 같은 "기억에 민감한 시스템"을 가지고 있다면.
  • range록록여여 여여여복경경 경경경경 。

3.의 PS: Python 3.x †range2.의 "Python 2.x" == Python 2.x"xrange★★★★★★ 。

다들 잘 설명해 주셨어요.하지만 직접 보고 싶었어요나는 python3를 쓴다.그래서 (Windows!에서) 리소스 모니터를 열고 먼저 다음 명령을 실행했습니다.

a=0
for i in range(1,100000):
    a=a+i

그리고 '사용 중' 메모리의 변경 사항을 확인했습니다.대수롭지 않았다.그런 다음 다음 코드를 실행했습니다.

for i in list(range(1,100000)):
    a=a+i

메모리도 많이 필요했고요.그리고 나는 확신했다.직접 드셔보셔도 됩니다.

Python 2X를 사용하는 경우 첫 번째 코드에서 'range()'를 'xrange()'로, 'list(range()'를 'range()'로 바꿉니다.

도움말 문서에서.

파이썬 2.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.

파이썬 3.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

이는명명 명명명다다2. Python 2.x의 rangexrange복rangerange xrange xrange rangerangerangerange rangerangerange rangerange 。

3. Python 3.x의 range becomes가 되다xrange2.및 Python 2.의 »xrange이 삭제됩니다.

range() Python에서2.x

으로 오래된 입니다.range()Python Python에서 2.x and and and of of of of of of의 인스턴스를 합니다.list지정된 범위의 요소를 포함하는 개체입니다.

다만, 이 실장은, 번호의 범위를 가지는 리스트를 초기화할 때는, 너무 비효율적입니다.를 들어, 「」라고 하는 것은,for i in range(1000000)메모리 및 시간 사용률 측면에서 이 목록을 메모리에 저장해야 하므로 실행하는 데 비용이 많이 듭니다.


range() Python에서3.xPython에서는2.x

Python 이 python 3.x introdu introdu introdu introdu introdu introdu introdu introdu introdu introdu introdu range() Python(Python)에서하지만)2.x xrange()★★★★★★★★★★★★★★★★★★」

range()게으른 평가로 알려진 전략을 이용합니다.새로운 실장에서는, 범위내의 요소의 방대한 리스트를 작성하는 대신에, 클래스가 도입됩니다.range메모리에는 명시적으로 저장하지 않고 특정 범위의 필수 요소를 나타내는 경량 객체입니다(이것은 제너레이터처럼 들릴 수 있지만 느린 평가의 개념은 다릅니다).


예를 들어 다음 사항을 고려하십시오.

# Python 2.x
>>> a = range(10)
>>> type(a)
<type 'list'>
>>> b = xrange(10)
>>> type(b)
<type 'xrange'>

그리고.

# Python 3.x
>>> a = range(10)
>>> type(a)
<class 'range'>

0-N 항목의 스캔/인쇄 요건의 경우 범위 및 xrange는 다음과 같이 동작합니다.

range() - 메모리에 새 목록을 만들고 0 ~N개의 항목(완전 N+1) 전체를 가져와 인쇄합니다.xrange() - 항목을 스캔하고 현재 발견된 항목만 메모리에 저장하기 위해 항상 같은 양의 메모리를 사용하는 반복기 인스턴스를 만듭니다.

필요한 요소가 목록의 선두에만 있는 경우 시간과 메모리가 상당히 절약됩니다.

range는 목록을 반환하고 xrange는 range 크기에 관계없이 동일한 메모리를 사용하는 xrange 개체를 반환합니다.이 경우 1회마다 하나의 요소만 생성되어 사용 가능한 반면 range를 사용하는 경우에는 모든 요소가 한 번에 생성되어 메모리 내에서 사용 가능합니다.

.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%

range :-range는 모든 것을 한 번에 읽습니다.즉, 범위의 모든 숫자가 메모리를 차지하게 됩니다.

xrange :-xrange는 제너레이터와 같은 것입니다.숫자의 범위는 필요하지만 loop.so 메모리의 효율화를 위해 를 사용하는 경우와 같이 저장하지 않는 경우에 표시됩니다.

를 하면 약을 수 있다list(xrange(...)) 상당합니다.range(...).

★★★★★★★★★★★★★★★★★.list

한 also도.xrange가 완전히 않다

xrange 표시

범위와 xrange의 차이를 알아보려면 다음 게시물을 참조하십시오.

견적 내용:

range 0 으로 하는 정의된 입니다.정수는 0 으로 시작합니다.xrange단, 는 'xrange object'를 반환합니다.이 오브젝트는 반복기처럼 동작합니다.

언급URL : https://stackoverflow.com/questions/94935/what-is-the-difference-between-range-and-xrange-functions-in-python-2-x