분명히 xrange는 빠르지 만 왜 그것이 더 빠르는지 (그리고 지금까지 일화 외에 더 빠르다는 증거가 없음) 또는 그 외에 다른 것이 무엇인지 전혀 모른다.
for i in range(0, 20):
for i in xrange(0, 20):
답변
Python 2.x에서 :
-
range
리스트를 생성하므로, 그렇게하면range(1, 10000000)
리스트를 메모리에리스트로 생성합니다9999999
. -
xrange
느리게 평가되는 시퀀스 객체입니다.
파이썬 3에서는 range
python ‘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에는 range
2.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
.