Ich dachte über die folgende Frage über die Architektur des Computers nach. Angenommen ich in PythonLeistung der Liste (...). Einfügen (...)
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()
die log n
nimmt, plus, wenn ich es richtig verstanden hat, ein Speicherkopiervorgang für x[index:]
. Jetzt habe ich kürzlich gelesen, dass der Flaschenhals normalerweise in der Kommunikation zwischen Prozessor und Speicher liegt, so dass die Speicherkopie durch RAM recht schnell erledigt werden kann. So funktioniert das?
Nun, ich sage nicht, dass Memcpy() ist O (1) - ich weiß, es ist O (n), aber die Konstante kann klein sein - und ich bin mir nicht sicher, ob es wirklich durch Speicher optimiert ist. Aber wenn es so optimiert ist, dass es 1000 mal schneller ist, als man naiv denkt, ist das wahrscheinlich etwas Wissenswertes. –
In einigen Fällen ist in der Liste möglicherweise kein Speicherplatz mehr vorhanden. Daher muss die gesamte Liste kopiert werden, nachdem neuer freier Speicher zugewiesen wurde und nicht nur ein memmove/memcpy. –
Die Antwort ist gültig, aber der erste Absatz ist im Allgemeinen nicht unbedingt richtig. Eine Sprache kann angeben, welche Vorgänge unter bestimmten Umständen so gestaltet sind, dass sie auch dann effizient sind, wenn Sie den Quellcode einer bestimmten Implementierung betrachten. Sie können daher bestimmte Leistungseigenschaften dieser Operationen annehmen, vorausgesetzt, die Implementierung ist konform. – LarsH