コンピュータのアーキテクチャに関する次の質問について考えました。私はそれを正しく理解すれば、log n
をとり、プラスのPythonリストのパフォーマンス(...)。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()
、x[index:]
ためのメモリコピー操作で行うとします。今私は最近ボトルネックはプロセッサとメモリの間の通信にあるので、メモリコピーはが非常に高速に処理できることを最近読んだ。それはどのように働くのですか?
memcpy()はO(1)だと言っているのではない - 私はO(n)だと分かっていますが、定数は小さくてもかまいません。しかし、もしそれが、あなたが純粋に考えるよりも1000倍速くなるように最適化されていれば、それはおそらく知る価値のあるものです。 –
場合によっては、リストにスペースが残っていない可能性があるので、memmove/memcpyの代わりに新しい空きメモリーが割り当てられた後にリスト全体をコピーする必要があります。 –
答えは有効ですが、最初の段落は一般的に必ずしも真ではありません。言語は、特定の状況下で効率的になるように設計された操作を指定することができるため、特定の実装のソースコードを見なくても、実装が適合していると仮定すると、それらの操作の特定のパフォーマンス特性を確信することができます。 – LarsH