문제

분명히 xrange 은 빠르지만 내가 아무 생각이 왜 그것은 빠르게(그리고 증거 외에는 일화는 지금까지 그것은 더 빠르게)또는 어떤 외에는 다른 대

for i in range(0, 20):
for i in xrange(0, 20):
도움이 되었습니까?

해결책

범위 목록을 만듭니다,그래서 당신 range(1, 10000000) 그것은 목록을 작성하여 메모리에서 9999999 요소입니다.

xrange 순서는 개체를 평가하는 지연.

그것을 추가해야에서@티아고의 힌트는 python3,범위가 해당하는 파이썬's 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 만점 범위 params 고의 숫자가 생성입니다.그러나 그 C 의 구현 Python 현재 제한 그 args 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.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 는 발전기,그래서 그것을 평가하는 지연.

당신이 가져오는 두 가지 장점:

  1. 반복할 수 있는 더 이상 목록이 없 MemoryError.
  2. 그것이 해결합 각각의 번호를 느리게,를 중지할 경우 반복기,당신이 시간을 낭비하지 않아도 만드는 전체 목록을 확인합니다.

저는 충격을 받았는 아무도 읽 doc:

이 기능은 매우 비슷하기 range(), 하지만 반환합니다 xrange 대신 개체의 목록입니다.이것은 불투명한 시퀀스 입력하는 수익률이 동일한 값으로 목록은 해당없이 실제로 저장하는 모든다.의 장점 xrange()range() 최소(이후 xrange() 여전히 만드는 값에 대해 물었을 때 그들)경우를 제외하고는 매우 넓은 범위에서 사용되는 메모리 굶어 기기의 모든 범위의 요소들이 결코 이용(할 때와 같은 루프가 일반적으로 종료 break).

그것은 최적화를 위한 이유입니다.

범위()목록을 작성의 값은 시작부터 끝까지(0..20 에서 당신의 예).이 될 것입니다 비용이 많이 드는 작업에서 매우 큰 범위를 다룹니다.

xrange()다른 한편으로 훨씬 더 많은 최적화 됩니다.그것은 단지 계산하는 다음 값이 필요한 경우(통해 xrange 시퀀스 개체)지 않고 목록을 작성하는 모든 값의 범위는 다음과 같()는 않습니다.

을 찾을 수 있는 장점 xrangerange 이 간단한 예제:

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 루프에서(내가 사용해야 한다 시간, 지만,이는 신속하게 해킹에서 메모리를 사용하여 간단한 목록의 이해를 들어)나는 다음과 같다:

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 for loop:

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.1 문서

범위 객체가 아주 작은 행동:그들만 지원하는 인덱싱을 반복하고 len 기능입니다.

그러나,3.2+, range 전체 시퀀스—그것을 지원하는 확장된,조각의 모든 방법 collections.abc.Sequence 으로 동일한 의미로 list.*

고,적어도 CPython 및 디버깅 심볼이 들어(두 3.2+구현에서는 현재 존재한다),그것은 또한 일정 시간의 구현 indexcount 방법과 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 그래픽 분석합니다.

Python 범위에 대 xrange

xrange 사용하여 반복기(가치를 발생시 즉),범위 목록을 반환합니다.

무엇인가?
range 반환 정적 목록에 runtime.
xrange 반환합니다 object (와 같은 역할을 하는 발전기,하지만 그것은 확실히지 않는 한)에서는 값으로 생성 및 할 때 필요합니다.

을 사용하는 경우는?

  • xrange 는 경우를 생성하려는 목록에 대한 거대한 범위의 말하는 1 억 특히,당신은"메모리의 민감한 시스템"같은 휴대 전화입니다.
  • range 하려는 경우 반복 목록 여러 번입니다.

PS:Python3.x range 기능==Python2.x xrange 기능입니다.

에서 요구 사항에 대한 스캐닝/인쇄 0-N 항목,범위 및 xrange 는 다음과 같습니다.

범위()-새로 만들고 목록을 메모리에 걸리는 전체적인 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

그것의 큰 덩어리를 위한 메모리를 사용합니다.고,나는 확신합니다.당신은 그것을 시도 할 수 있습니다.

사용하는 경우에는 파이썬 2X,교체'범위()'와'xrange()'에서 첫 번째 코드고'목록(범위())'와'범위()'.

범위 반환 목록xrange 반환합니다 xrange 체 소요되는 동일한 메모리에 관계 없이 범위의 크기로,이 경우에는,단지 하나의 요소는 생성 및 사용할 수당의 반복하는 반면에 사용하는 경우,범위의 모든 요소를 생성되는 한 번에과에서 사용할 수 있습니다.

범위:-범위를 채웁니다 한 번에 모든 것을.을 의미하는 모든 숫자의 범위를 차지합니다.

xrange:-xrange 같은 것 발전기,그것은 그림으로 올 때 당신이 원하는 숫자의 범위는 하지만 당신은 그들이 원하는 저장처럼 사용하고자 할 때에는 반복입니다.그래서 메모리에 효율적입니다.

에서 도움말 문서.

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 체는 반복 가능한.

Python3.x, rangexrange Python2.x xrange 이 제거됩니다.

또한,는 경우 list(xrange(...)) 에 상응하는 것입니다 range(...).

그래서 list 속도가 느립니다.

xrange 정말이지 않는 완전히 마무리 순서

그래서 그 이유는 그 목록을 사용할 수 없습니다,그것은 xrange

게시 을 찾 차이점 범위와 xrange:

을 인용하는:

range 반환 정확하게 당신이 무슨 생각:목록속 정수의 정의 길이가 0 으로 시작. xrange, 그러나, 반환합니다 "xrange object", 역할을 하는 좋은 거래를 반복기

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top