-
파이썬의 range는 게으른 연산(lazy evaluation)이다.개발 흉내 2022. 2. 21. 17:56
range 는 항상 같은 메모리를 차지한다.
range 는 lazy evaluation 이기 때문에 범위가 커진다고 메모리가 커지진 않는다.
>>> from sys import getsizeof >>> getsizeof(range(1_000_000_000_000_000)) 48
정수값을 천조개를 미리 연산해서 갖고 있으려면 메모리가 적어도 1PB 는 있어야하지만 lazy 하게 연산하기 때문에 항상 일정한 메모리를 차지하게 된다.
1_000_000_000_000_000 in range(1_000_000_000_000_001)
는 빠르다.range 에 포함되어있는지를 계산하는 in 연산은 매우 빠르다.
>>> from timeit import timeit >>> expr = """ ... 1_000_000_000_000_000 in range(1_000_000_000_000_001) ... """ >>> elapsed_time = timeit(expr, number=1) >>> f"elapsed time: {elapsed_time:.9f}s" 'elapsed time: 0.000004290s'
범위의 처음부터 끝까지 탐색했다면 이렇게 빨리 끝나지 않았을 것이다.
버전 3.2에서 변경: 시퀀스 ABC를 구현합니다. int 객체의 포함 검사는 모든 항목을 이터레이트하는 대신 상수 시간으로 수행됩니다.
공식 문서에 따르면 포함 검사는 O(1) 라고 한다. 아마
__contains__
를return start <= i < stop and (i - start) % step == 0
으로 구현하지 않았을까?