2013-04-27 4 views
10

len() 작동 방식을 알고 싶습니다.파이썬 카운트 목록 길이 길이

len()을 호출 할 때마다 목록의 처음부터 끝까지 계산됩니다. 또는 목록도 클래스이므로 len()은 목록의 길이를 기록하는 목록 개체의 변수 만 반환합니까?

또한, 나는

+0

리스트 객체의'__len__' 메소드를 호출합니다. 당신은 여기에 소스를 볼 수 있습니다 : http://svn.python.org/view/python/tags/r27/Objects/listobject.c?view=markup – Blender

+0

그것은 그것의 길이를 추적하므로 매 시간마다 재개하지 않습니다. –

+0

그리고 내장 소스의 소스는 다음과 같습니다. http://hg.python.org/releasing/2.7.4/file/9290822f2280/Python/bltinmodule.c#l928 – Blender

답변

16

다운로드 파이썬 2.7 소스 코드 : http://www.python.org/getit/releases/2.7.4/

list./Include/listobject.h./Objects/listobject.c에서 구현됩니다.

typedef struct { 
    PyObject_VAR_HEAD 
    /* Vector of pointers to list elements. list[0] is ob_item[0], etc. */ 
    PyObject **ob_item; 

    /* ob_item contains space for 'allocated' elements. The number 
    * currently in use is ob_size. 
    * Invariants: 
    *  0 <= ob_size <= allocated 
    *  len(list) == ob_size 
    *  ob_item == NULL implies ob_size == allocated == 0 
    * list.sort() temporarily sets allocated to -1 to detect mutations. 
    * 
    * Items must normally not be NULL, except during construction when 
    * the list is not yet visible outside the function that builds it. 
    */ 
    Py_ssize_t allocated; 
} PyListObject; 

list.__len__() 단지 PyObject_VAR_HEAD의 일부인 ob_size을 협의. 이것은 len()을리스트의 상수 시간 연산으로 만듭니다.

+0

가장 관련성이 높기 때문에 PyObject_VAR_HEAD를 포함시켜야합니다. – jamylak

+0

헤더 파일 소스에 대한 직접 링크 : https://svn.python.org/projects/python/trunk/Include/listobject.h – hoju

1

글쎄, 당신은 찾을 수 등, 내가 좋아하는 그 내장 함수 '렌()', '지도()'의 소스 코드를 찾을 수있는 사람이 말해 수 있기를 바랍니다 내장 함수 here의 문서

데이터 유형이 list이면 보유하고있는 요소의 수를 추적하므로 len(list)은 O (1) 연산입니다. 소스 코드에 대한


, 당신은 the download page에서 파이썬의 소스 코드를 찾을 수 있습니다. 여기