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

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



답변

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


답변

그리고 그것이 어떻게되었는지 알아내는 또 다른 방법은 Google 코드 검색에서 찾아 보려면 소스를 직접 다운로드하고 싶지 않다면 GitHub 에서 소스를보십시오.

static Py_ssize_t list_length(PyListObject *a)
{
    return a->ob_size;
}


답변

lenO (1) 연산 입니다.


답변

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

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

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

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


답변

질문에 대한 답변을 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

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


답변

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


답변

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