Python: ¿Las listas de Python mantienen un recuento para len () o cuentan para cada llamada?

Si sigo llamando a len () en una lista muy larga, ¿estoy perdiendo el tiempo o mantiene un conteo internacional en el fondo?

No se preocupe: por supuesto, guarda el conteo y, por lo tanto, len() en las listas es una operación bastante barata. Lo mismo es cierto para cadenas, diccionarios y conjuntos, por cierto!

Y una forma más de descubrir cómo se hace es para buscarlo en Google Code Search mire la fuente en GitHub , si no desea descargar la fuente usted mismo.

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

len es una operación O (1) .

Escriba su progtwig para que esté optimizado para mayor claridad y fácil de mantener . ¿Su progtwig es más claro con una llamada a len(foo) ? Entonces haz eso.

¿Estás preocupado por el tiempo empleado? Utilice el módulo timeit en la biblioteca estándar para medir el tiempo empleado y ver si es significativo en su código.

Como la mayoría de las personas, es muy probable que se equivoque en sus suposiciones sobre qué partes de su progtwig son las más lentas. Evita la tentación de adivinar y, en cambio, mídelo para descubrirlo.

Recuerde que la optimización prematura es la raíz de todo mal , en palabras de Donald Knuth. Solo concéntrese en la velocidad del código en el que ha medido la velocidad, para saber si vale la pena el costo de cambiar su funcionamiento.

La pregunta ha sido respondida ( len es O (1)), pero aquí le indicamos cómo puede verificarlo usted mismo:

 $ 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 

Sí, no realmente más lento.

Una “lista” de Python es realmente una matriz de tamaño variable, no una lista vinculada, por lo que almacena el tamaño en algún lugar.

Tiene que almacenar la longitud en algún lugar, por lo que no se cuenta el número de elementos cada vez.