Ho pensato alla seguente domanda sull'architettura del computer. Supponiamo che io faccio in PythonRendimento della lista (...). Insert (...)
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()
che prende log n
, più, se ho ben capito, un'operazione di copia della memoria per x[index:]
. Recentemente ho letto che il collo di bottiglia si trova di solito nella comunicazione tra il processore e la memoria, quindi la copia della memoria potrebbe essere eseguita dalla RAM abbastanza velocemente con la. È così che funziona?
Beh, non sto dicendo che memcpy() è O (1) - So che è O (n), ma la costante può essere piccola - e non sono sicuro che sia davvero ottimizzata dalla memoria. Ma se è ottimizzato per essere, diciamo, 1000 volte più veloce di quanto si possa pensare in modo ingenuo, probabilmente è qualcosa che vale la pena conoscere. –
In alcuni casi, potrebbe non esserci più spazio nell'elenco, quindi l'intera lista deve essere copiata dopo che è stata allocata una nuova memoria libera invece di un memmove/memcpy. –
La risposta è valida, ma il primo paragrafo non è necessariamente vero in generale. Una lingua può specificare quali operazioni sono progettate per essere efficienti in determinate circostanze, in modo che anche senza guardare il codice sorgente di una particolare implementazione, si possa essere sicuri di certe proprietà delle prestazioni di tali operazioni, assumendo che l'implementazione sia conforme. – LarsH