Pensé en la siguiente pregunta sobre la arquitectura de la computadora. Supongamos que yo hago en PythonRendimiento de la lista (...). Insertar (...)
from bisect import bisect
index = bisect(x, a) # O(log n) (also, shouldn't it be a standard list function?)
x.insert(index, a) # O(1) + memcpy()
que tiene log n
, además, si yo lo entiendo correctamente, una operación de copia de memoria para x[index:]
. Ahora leí recientemente que el cuello de botella suele estar en la comunicación entre el procesador y la memoria, por lo que la copia de memoria podría ser hecha por RAM bastante rápido. ¿Es así como funciona?
Bueno, no estoy diciendo que memcpy() sea O (1) - Sé que es O (n), pero la constante puede ser pequeña, y no estoy seguro si está realmente optimizado por la memoria. Pero si está optimizado para ser, digamos, 1000 veces más rápido de lo que pensaría ingenuamente, eso probablemente sea algo que valga la pena saber. –
En algunos casos, puede que no quede espacio en la lista, por lo que toda la lista debe copiarse después de asignar nueva memoria libre en lugar de solo memmove/memcpy. –
La respuesta es válida, pero el primer párrafo no es necesariamente cierto en general. Un lenguaje puede especificar qué operaciones están diseñadas para ser eficientes en determinadas circunstancias, de modo que incluso sin mirar el código fuente de una implementación en particular, puede confiar en ciertas propiedades de rendimiento de esas operaciones, suponiendo que la implementación sea conforme. – LarsH