Python : Python 목록은 len ()에 대한 개수를 유지합니까, 아니면 각 호출에 대해 계산합니까?


79

너무 긴 목록에서 len ()을 계속 호출하면 시간을 낭비하고 있습니까? 아니면 백그라운드에서 정수 개수를 유지합니까?


이것은 항상 나를 괴롭 혔습니다. 특히 프로파일 러가이 함수를 호출하는 데 1 분 동안 실행되는 프로그램의 2.2 초를 보냈다고 말했을 때.
Nathan

답변:


87

걱정하지 마십시오. 물론 개수를 절약하므로 len()목록에있는 작업은 상당히 저렴합니다. 그런데 문자열, 사전 및 세트도 마찬가지입니다!


나는 그것이 마지막 항목 +1 또는 무언가의 인덱스와 같은 카운트를 유지하고 해당 메모리 위치에서 len () 값을 호출한다고 생각합니다. 내가 맞아?
geekidharsh



13

명확성을 위해 최적화되고 쉽게 유지 관리 할 수 있도록 프로그램을 작성하십시오 . 에 대한 호출로 프로그램이 더 명확 len(foo)합니까? 그럼 그렇게하세요.

걸리는 시간이 걱정 되십니까? timeit표준 라이브러리모듈을 사용하여 소요 시간 을 측정 하고 이것이 코드에서 중요한지 확인하십시오.

대부분의 사람들과 마찬가지로 프로그램의 어느 부분이 가장 느린 지에 대한 추측이 틀릴 가능성이 높습니다. 추측하려는 유혹을 피하고 대신 측정하여 알아 내십시오.

Donald Knuth의 말에 따르면 조기 최적화는 모든 악의 근원 임을 기억하십시오 . 측정 한 코드 속도에만 집중하세요. 한 작동 방식을 변경하는 데 드는 비용의 가치가 있는지 확인하십시오.


1
저는 일을 시작한 지 불과 몇 달 만에 코더이며 두 가지 관행을 모두지지합니다. 타이머 물건은 당신의 길을 뚫을 수있는 많은 관습적인 지혜 ( "SELECT .. RANDOM is too 비싸다")에 대한 2 선 방어를 제공합니다.
Jesvin Jose 2011-08-05

5

질문에 대한 답변을 len받았지만 ( 은 O (1)), 직접 확인할 수있는 방법은 다음과 같습니다.

$ python -m timeit -s "l = range(10)" "len(l)"
10000000 loops, best of 3: 0.119 usec per loop
$ python -m timeit -s "l = range(1000000)" "len(l)"
10000000 loops, best of 3: 0.131 usec per loop

네, 정말 느리지 않습니다.


3

파이썬 "목록"은 실제로 크기를 조정할 수있는 배열이지 연결 목록이 아니므로 크기를 어딘가에 저장합니다.


0

길이를 어딘가에 저장해야하므로 매번 항목 수를 세지 않습니다.


4
모든 언어에서 반드시 그런 것은 아닙니다. 일부 언어는 실제로 연결 목록을 사용하며 메타 데이터를 약 크기로 유지하거나 유지하지 않을 수 있습니다. 완벽한 예는 Lisp입니다. 여기서 목록은 메타 데이터없이 자체를 구축하기 위해 비교적 원시적 인 2 개의 셀 구조를 사용합니다. 이 경우 길이 호출은 O (n) 시간이 걸립니다.
Ashton K
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.