답변:
이러한 데이터 유형에서 len ()을 호출 하는 것은 Python 언어의 가장 일반적인 구현 인 CPython 에서 O (1)입니다 . 다음은 CPython에서 다양한 기능의 알고리즘 복잡성을 제공하는 테이블에 대한 링크입니다.
모든 객체는 자신의 길이를 추적합니다. 길이를 추출하는 시간은 작고 (big-O 표기법의 O (1)) [대부분의 설명, C 용어가 아닌 Python 용어로 작성 됨]으로 구성됩니다. 사전에서 "len"을 찾아서 내장 된 len 함수는 객체의 __len__
메소드를 찾고 호출 할 것입니다 ...return self.length
length
사전에 사전에 나타나지 dir(list)
않습니까?
list.lenght
변수는 Python이 아닌 C로 구현됩니다.
아래 측정 값은 len()
자주 사용되는 데이터 구조에 대한 O (1) 증거를 제공합니다 .
주의 사항 timeit
: -s
플래그가 사용되고 두 문자열이 timeit
첫 번째 문자열 로 전달 되면 한 번만 실행되며 시간이 지정되지 않습니다.
$ python -m timeit -s "l = range(10);" "len(l)"
10000000 loops, best of 3: 0.0677 usec per loop
$ python -m timeit -s "l = range(1000000);" "len(l)"
10000000 loops, best of 3: 0.0688 usec per loop
$ python -m timeit -s "t = (1,)*10;" "len(t)"
10000000 loops, best of 3: 0.0712 usec per loop
$ python -m timeit -s "t = (1,)*1000000;" "len(t)"
10000000 loops, best of 3: 0.0699 usec per loop
$ python -m timeit -s "s = '1'*10;" "len(s)"
10000000 loops, best of 3: 0.0713 usec per loop
$ python -m timeit -s "s = '1'*1000000;" "len(s)"
10000000 loops, best of 3: 0.0686 usec per loop
$ python -mtimeit -s"d = {i:j for i,j in enumerate(range(10))};" "len(d)"
10000000 loops, best of 3: 0.0711 usec per loop
$ python -mtimeit -s"d = {i:j for i,j in enumerate(range(1000000))};" "len(d)"
10000000 loops, best of 3: 0.0727 usec per loop
$ python -mtimeit -s"import array;a=array.array('i',range(10));" "len(a)"
10000000 loops, best of 3: 0.0682 usec per loop
$ python -mtimeit -s"import array;a=array.array('i',range(1000000));" "len(a)"
10000000 loops, best of 3: 0.0753 usec per loop
$ python -mtimeit -s"s = {i for i in range(10)};" "len(s)"
10000000 loops, best of 3: 0.0754 usec per loop
$ python -mtimeit -s"s = {i for i in range(1000000)};" "len(s)"
10000000 loops, best of 3: 0.0713 usec per loop
$ python -mtimeit -s"from collections import deque;d=deque(range(10));" "len(d)"
100000000 loops, best of 3: 0.0163 usec per loop
$ python -mtimeit -s"from collections import deque;d=deque(range(1000000));" "len(d)"
100000000 loops, best of 3: 0.0163 usec per loop
len()
하고 -s
플래그 를 올바르게 사용하도록 측정을 수정했습니다 .
python -m timeit -s "l = range(10000);" "len(l); len(l); len(l)"
루프 당 223 nsec 루프 당 python -m timeit -s "l = range(100);" "len(l)"
66.2 nsec
파이썬에서 len ()이 목록의 크기에 달려 있다고 생각했기 때문에 여러 번 사용하면 항상 길이를 변수에 저장합니다. 그러나 오늘 디버깅하는 동안 목록 객체에서 __len__ 속성을 발견 했으므로 len ()이 그것을 가져와야하므로 O (1) 복잡성을 만듭니다. 누군가가 이미 요청 하여이 게시물을 보았을 때 방금 봤습니다.
__len__
목록의 길이를 나타내는 변수가 아닌 함수입니다.
list.__len__
함수가 일정한 시간에 실행 된다는 것을 어떻게 알 수 있습니까? 그것은 단지 기능 때문이 아니라 기능입니다. 그렇게 구현했기 때문입니다.