Si sigo llamando a len () en una lista muy larga, ¿estoy perdiendo el tiempo o mantiene un recuento de int en segundo plano?
Si sigo llamando a len () en una lista muy larga, ¿estoy perdiendo el tiempo o mantiene un recuento de int en segundo plano?
Respuestas:
No se preocupe: por supuesto, guarda el recuento y, len()por lo tanto, en las listas es una operación bastante barata. ¡Lo mismo ocurre con las cadenas, los diccionarios y los conjuntos, por cierto!
Y una forma más de averiguar 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;
}
Escriba su programa de modo que esté optimizado para mayor claridad y fácil de mantener . ¿Su programa es más claro con una llamada a len(foo)? Entonces haz eso.
¿Le preocupa el tiempo que lleva? Utilice el timeitmódulo de la biblioteca estándar para medir el tiempo necesario y ver si es significativo en su código.
Como la mayoría de la gente, es muy probable que se equivoque al adivinar qué partes de su programa son más lentas. Evite la tentación de adivinar y, en cambio, mida para averiguarlo.
Recuerde que la optimización prematura es la raíz de todos los males , en palabras de Donald Knuth. Concéntrese únicamente en la velocidad del código cuya velocidad ha medido para saber si el beneficio valdría la pena el costo de cambiar su funcionamiento.
La pregunta ha sido respondida ( lenes O (1)), pero así es como 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 más lento.
Tiene que almacenar la longitud en algún lugar, por lo que no está contando la cantidad de elementos cada vez.