¿Cuál es el costo de la len()
función para las incorporaciones de Python? (lista / tupla / cadena / diccionario)
290
¿Cuál es el costo de la len()
función para las incorporaciones de Python? (lista / tupla / cadena / diccionario)
Es O (1) (tiempo constante, no depende de la longitud real del elemento, muy rápido) en cada tipo que ha mencionado, más set
y otros como array.array
.
Llamar a len () en esos tipos de datos es O (1) en CPython , la implementación más común del lenguaje Python. Aquí hay un enlace a una tabla que proporciona la complejidad algorítmica de muchas funciones diferentes en CPython:
Página Wiki de TimeComplexity Python
fuente
Todos esos objetos siguen su propia longitud. El tiempo para extraer la longitud es pequeño (O (1) en notación big-O) y consiste principalmente en [descripción aproximada, escrita en términos de Python, no en términos de C]: busque "len" en un diccionario y envíelo al función built_in len que buscará el
__len__
método del objeto y lo llamará ... todo lo que tiene que hacer esreturn self.length
fuente
length
aparece en el diccionario pordir(list)
?list.lenght
variable ilustrada se implementa en C, no en Python.Las siguientes mediciones proporcionan evidencia de que
len()
es O (1) para estructuras de datos que se utilizan con frecuencia.Una nota con respecto a
timeit
: cuando-s
se usa el indicador y se pasan dos cadenas atimeit
la primera cadena, se ejecuta solo una vez y no se cronometra.Lista:
Tupla:
Cuerda:
Diccionario (comprensión del diccionario disponible en 2.7+):
Formación:
Conjunto (conjunto de comprensión disponible en 2.7+):
Deque:
fuente
len()
y también arreglé las medidas para usar correctamente la-s
bandera.python -m timeit -s "l = range(10000);" "len(l); len(l); len(l)"
223 nseg por ciclopython -m timeit -s "l = range(100);" "len(l)"
66.2 nsec por ciclolen es un O (1) porque en su RAM, las listas se almacenan como tablas (series de direcciones contiguas). Para saber cuándo se detiene la mesa, la computadora necesita dos cosas: longitud y punto de inicio. Es por eso que len () es un O (1), la computadora almacena el valor, por lo que solo necesita buscarlo.
fuente
He estado pensando en len () en Python depende del tamaño de la lista, por lo que siempre almaceno la longitud en una variable si la uso varias veces. Pero hoy durante la depuración, noté el atributo __len__ en el objeto de la lista, por lo que len () solo debe buscarlo, lo que hace que la complejidad sea O (1). Así que busqué en Google si alguien ya lo ha preguntado y me encontré con esta publicación.
fuente
__len__
es una función, no una variable que representa la longitud de una lista.list.__len__
función se ejecuta en tiempo constante? Lo hace, pero no solo porque es una función. Porque se implementó así.