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.