분명히 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.
