ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬의 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 으로 구현하지 않았을까?

    댓글

Designed by Tistory.