len()
Python 내장 기능 의 비용은 얼마입니까? (목록 / 튜플 / 문자열 / 사전)
답변
그것은의 O (1) 당신이 언급 한 모든 유형에서 플러스 – (매우 빠른 일정 시간은, 요소의 실제 길이를 따라하지 않음) set
와 같은 다른 사람 array.array
.
답변
이러한 데이터 유형에서 len ()을 호출 하는 것은 Python 언어의 가장 일반적인 구현 인 CPython 에서 O (1)입니다 . 다음은 CPython에서 다양한 기능의 알고리즘 복잡성을 제공하는 테이블에 대한 링크입니다.
답변
모든 객체는 자신의 길이를 추적합니다. 길이를 추출하는 시간은 작고 (big-O 표기법의 O (1)) [대부분의 설명, C 용어가 아닌 Python 용어로 작성 됨]으로 구성됩니다. 사전에서 “len”을 찾아서 내장 된 len 함수는 객체의 __len__
메소드를 찾고 호출 할 것입니다 …return self.length
답변
아래 측정 값은 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
사전 (2.7 이상에서 사용 가능한 사전-이해) :
$ 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
세트 (2.7 이상에서 사용 가능한 세트 이해) :
$ 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
답변
RAM에서 목록은 테이블 (일련의 연속 주소) 로 저장되므로 len은 O (1 )입니다. 테이블이 언제 멈추는 지 알기 위해서는 길이와 시작점의 두 가지가 필요합니다. 그렇기 때문에 len ()이 O (1) 인 이유는 컴퓨터가 값을 저장하기 때문입니다.
답변
파이썬에서 len ()이 목록의 크기에 달려 있다고 생각했기 때문에 여러 번 사용하면 항상 길이를 변수에 저장합니다. 그러나 오늘 디버깅하는 동안 목록 객체에서 __len__ 속성을 발견 했으므로 len ()이 그것을 가져와야하므로 O (1) 복잡성을 만듭니다. 누군가가 이미 요청 하여이 게시물을 보았을 때 방금 봤습니다.