[python] Python 2.X에서 range와 xrange 함수의 차이점은 무엇입니까?

분명히 xrange는 빠르지 만 왜 그것이 더 빠르는지 (그리고 지금까지 일화 외에 더 빠르다는 증거가 없음) 또는 그 외에 다른 것이 무엇인지 전혀 모른다.

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



답변

Python 2.x에서 :

  • range리스트를 생성하므로, 그렇게하면 range(1, 10000000)리스트를 메모리에리스트로 생성합니다 9999999.

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

파이썬 3에서는 rangepython ‘s와 동일 xrange하며 목록을 얻으려면을 사용해야 list(range(...))합니다.


답변

range는리스트를 생성하므로, 그렇게하면 range(1, 10000000)리스트를 메모리에리스트로 생성합니다 9999999.

xrange 는 생성기이므로 시퀀스 객체 느리게 평가됩니다.

이것은 사실이지만 Python 3에서는 .range()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()을 다루지 않는 한 항상을 사용 합니다. 백만 항목 목록에 대해 시간별로 볼 수 있듯이 추가 오버 헤드는 0.04 초에 불과합니다. Corey가 지적했듯이 Python 3.0에서는 사라지고 어쨌든 멋진 반복기 동작을 제공합니다..xrange().range()


답변

xrange범위 매개 변수 만 저장하고 요청시 숫자를 생성합니다. 그러나 Python의 C 구현은 현재 인수를 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]

Python 3.0에는 range2.x xrange만 있고 최소 및 최대 끝점에 대한 제한이없는 것처럼 작동합니다 .


답변

xrange는 반복자를 반환하고 한 번에 하나의 숫자 만 메모리에 유지합니다. range는 전체 숫자 목록을 메모리에 유지합니다.


답변

Library Reference 와 함께 시간을 보내십시오 . 익숙할수록 이와 같은 질문에 대한 답변을 더 빨리 찾을 수 있습니다. 내장 객체와 유형에 관한 처음 몇 장이 특히 중요합니다.

xrange 유형의 장점은 xrange 객체가 나타내는 범위의 크기에 관계없이 항상 동일한 양의 메모리를 사용한다는 것입니다. 일관된 성능 이점이 없습니다.

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

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


답변

나는 아무도 문서를 읽지 않는다는 충격을 받았다 .

이 함수는와 매우 유사 range()하지만 xrange목록 대신 객체를 반환 합니다. 이것은 실제로 모두 동시에 저장하지 않고 해당 목록과 동일한 값을 생성하는 불투명 시퀀스 유형입니다. 의 장점 xrange()이상은 range()최소한 (때문에 xrange()범위의 모든 요소는 루프가있는 경우로서 (사용되지 않는 경우 매우 큰 범위의 메모리가 부족한 시스템에서 사용 또는 경우를 제외하고 그들에게 물었을 때 여전히 가치를 창출 할 수있다) 일반적으로)로 끝납니다 break.