Python
range()와 xrange()의 차이
시작 전 테스트환경 살피기
Time
2017년 08월 18일
OS
Linux(Ubuntu 16.04 LTS)
Language
Python 2.7
This is a versatile function to create lists containing arithmetic progressions. It is most often used in for loops. The arguments must be plain integers. If the step argument is omitted, it defaults to 1. If the start argument is omitted, it defaults to 0. The full form returns a list of plain integers [start, start + step, start + 2 * step, ...]. If step is positive, the last element is the largest start + i * step less than stop; if step is negative, the last element is the smallest start + i * step greater than stop. step must not be zero (or else ValueError is raised). Example:
built-in 함수로 일정 간격의 정수 값을 가진 list를 생성해주는 함수이다. 함수의 argument는 총 3개로 적어도 1개의 argument를 지정해 주어야 한다.
만약, argument 중 하나만 지정하면 자동으로 stop 으로 인식하며, 나머지 start와 step은 자동으로 0, 1 로 지정한다.
그리고 argument를 두 개 지정하면 자동으로 start와 stop으로 인식하며, step은 1로 지정된다.
>> 즉 인식 순서는 stop, start, step 이다.
>>> range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> range(0, 10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> range(0, 10, 1) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] |
이상한 값을 넣었을 때는 빈 리스트를 반환하며, 역순으로도 가능했다.
>>> range(10, 0, 2) [] >>> range(10, 0, -2) [10, 8, 6, 4, 2] |
This function is very similar to range(), but returns an xrange object instead of a list. This is an opaque sequence type which yields the same values as the corresponding list, without actually storing them all simultaneously. The advantage of xrange() over range() is minimal (since xrange() still has to create the values when asked for them) except when a very large range is used on a memory-starved machine or when all of the range’s elements are never used (such as when the loop is usually terminated with break). For more information on xrange objects, see XRange Type and Sequence Types — str, unicode, list, tuple, bytearray, buffer, xrange.
xrange() 함수는 range() 함수와 같은 동작을 한다. 전달하는 인자마저도! 다른 점이 딱 2개 있다.
하나, 반환되는 값의 type이 xrange type 이라는 것이다.
range() 로 생성되는 결과 값의 type은 list 이지만, xrange() 로 생성되는 결과 값의 type은 xrange type이다. ( 생소하다 'ㅁ'.. )
>>> type(range(10)) <type 'list'> >>> type(xrange(10)) <type 'xrange'> |
둘, 수정이 불가한 순차적 접근 가능한 데이터 입력타입으로 지정한 데이터 크기에 상관없이 memory 할당량이 일정하다.
>>> import sys >>> sys.getsizeof(range(10)) 152 >>> sys.getsizeof(range(100)) 872 >>> sys.getsizeof(xrange(10)) 40 >>> sys.getsizeof(xrange(100)) 40 |
위와 같이 range()의 경우 list의 사이즈가 늘어남에 따라 메모리 사용량이 늘어나지만 xrange()의 경우 할당량이 커져도 차지하는 메모리 사용량이 동일하다. 따라서 지정하는 범위가 클 수록 xrange()를 사용하는 것이 더 효율적이다.
Why ? 왜 그럴까?
range()의 결과 타입은 list 이다. list 타입의 경우에는 list 안에 속한 모든 데이터를 메모리에 적재하게 된다. 따라서 list의 크기 만큼 차지하는 메모리가 늘어나는 구조이다. 하지만, xrange() 는 자신에 속한 데이터값을 한꺼번에 메모리에 로드 하는 것이 아니라 해당 값에 접근 할때마다 그 값을 하나씩 로딩하는 방식이다.
이런 구조적 차이 때문에 xrange type의 경우 list에서 사용하는 다양한 함수를 사용할 수 없다. 예를 들면 slice나 operand 작업이 불가능 하다.
>>> range(10)[:3] [0, 1, 2] >>> range(5) + range(5) [0, 1, 2, 3, 4, 0, 1, 2, 3, 4] |
>>> xrange(10)[:3] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: sequence index must be integer, not 'slice' >>> xrange(5) + xrange(5) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for +: 'xrange' and 'xrange' |
'개발자 레니는 지금 - > 소프트웨어와 함께' 카테고리의 다른 글
[ Python ] Python Documents (0) | 2017.08.24 |
---|---|
[ Python ] map() 함수 (0) | 2017.08.24 |
[ Python ] Pickle! binary를 file에 자료형 그대로 저장하기! (0) | 2017.08.18 |
[ Python ] 시스템 명령어 실행하기 (0) | 2017.08.18 |
👻[ Python ] File 혹은 Dir 삭제하기 (0) | 2017.08.18 |