len () 함수 비용


답변:


341

그것은의 O (1) 당신이 언급 한 모든 유형에서 플러스 - (매우 빠른 일정 시간은, 요소의 실제 길이를 따라하지 않음) set와 같은 다른 사람 array.array.


17
유용한 답변에 감사드립니다! 그렇지 않은 기본 유형이 있습니까?
mvanveen


84

모든 객체는 자신의 길이를 추적합니다. 길이를 추출하는 시간은 작고 (big-O 표기법의 O (1)) [대부분의 설명, C 용어가 아닌 Python 용어로 작성 됨]으로 구성됩니다. 사전에서 "len"을 찾아서 내장 된 len 함수는 객체의 __len__메소드를 찾고 호출 할 것입니다 ...return self.length


3
구현 세부 사항에 대한 통찰력을 제공하기 때문에 이것이 가장 적합한 답변이라고 생각합니다.
AK

length사전에 사전에 나타나지 dir(list)않습니까?
ViFI

이것이 내가 찾던 것
Visakh Vijayan

@ViFI 단지 예일뿐입니다. 설명 된 list.lenght변수는 Python이 아닌 C로 구현됩니다.
코왈 스키

73

아래 측정 값은 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

1
우리가 이미 알고있는 것을 보여 주더라도 벤치 마크에는 좋지 않습니다. 이는 range (10) 및 range (1000000)이 O (1)이 아니어야하기 때문입니다.
알 수 없음

3
이것이 가장 좋은 대답입니다. 누군가 일정한 시간을 알지 못하는 경우를 대비하여 결론을 추가해야합니다.
산티아고 바 술토

4
의견 주셔서 감사합니다. 의 O (1) 복잡성에 대한 메모를 추가 len()하고 -s플래그 를 올바르게 사용하도록 측정을 수정했습니다 .
mechanical_meat

변수에 길이를 저장하면 상당한 계산 시간을 절약 할 수 있습니다. 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
Radostin Stoyanov

16

RAM에서 목록은 테이블 (일련의 연속 주소) 로 저장되므로 len은 O (1 )입니다. 테이블이 언제 멈추는 지 알기 위해서는 길이와 시작점의 두 가지가 필요합니다. 그렇기 때문에 len ()이 O (1) 인 이유는 컴퓨터가 값을 저장하기 때문입니다.


3

파이썬에서 len ()이 목록의 크기에 달려 있다고 생각했기 때문에 여러 번 사용하면 항상 길이를 변수에 저장합니다. 그러나 오늘 디버깅하는 동안 목록 객체에서 __len__ 속성을 발견 했으므로 len ()이 그것을 가져와야하므로 O (1) 복잡성을 만듭니다. 누군가가 이미 요청 하여이 게시물을 보았을 때 방금 봤습니다.


그러나 __len__목록의 길이를 나타내는 변수가 아닌 함수입니다.
코왈 스키

@Kowalski 예 LEN 함수이지만은 않습니다 모든, 그것은 self.length을 반환
AYUSH SENAPATI

그러나 귀하의 게시물은 그것에 대해 아무 말도하지 않습니다. 또한 list.__len__함수가 일정한 시간에 실행 된다는 것을 어떻게 알 수 있습니까? 그것은 단지 기능 때문이 아니라 기능입니다. 그렇게 구현했기 때문입니다.
Kowalski
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.