[解決済み] deque.popleft()とlist.pop(0)です。性能差はあるのでしょうか?
質問
deque.popleft()
と
list.pop(0)
は同じ結果を返すようです。両者にパフォーマンスの違いはあるのでしょうか、またその理由は?
解決方法は?
deque.popleft() は list.pop(0) よりも高速です。なぜなら deque は popleft() をおよそ O(1) で行うように最適化されており、一方 list.pop(0) には O(n) がかかるからです(参照)。 ディークオブジェクト ).
deque用の_collectionsmodule.cとlist用のlistobject.cのコメントとコードから、パフォーマンスの違いを説明する実装上の洞察が得られます。すなわち、dequeオブジェクトは2重にリンクされたリストで構成されており、両端での追加とポップを効果的に最適化します。一方、リストオブジェクトは単一にリンクされたリストですらなく、Cの配列(要素へのポインタの ( Python 2.7 listobject.h#l22 と Python 3.5 listobject.h#l23 このため、要素の高速ランダムアクセスには適していますが、最初の要素を削除した後、すべての要素を再配置するのにO(n)時間が必要です。
Python 2.7、3.5の場合、これらのソースコードのファイルのURLは以下の通りです。
-
https://hg.python.org/cpython/file/2.7/Modules/_collectionsmodule.c
-
https://hg.python.org/cpython/file/3.5/Modules/_collectionsmodule.c
timeit を使用すると、deque.popleft() と list.pop(0) の性能差は、deque と list が共に同じ 52 要素であれば約 4 倍、長さが 10**8 であれば 1000 倍以上になります。テスト結果は以下の通りです。
import string
from collections import deque
%timeit d = deque(string.letters); d.popleft()
1000000 loops, best of 3: 1.46 µs per loop
%timeit d = deque(string.letters)
1000000 loops, best of 3: 1.4 µs per loop
%timeit l = list(string.letters); l.pop(0)
1000000 loops, best of 3: 1.47 µs per loop
%timeit l = list(string.letters);
1000000 loops, best of 3: 1.22 µs per loop
d = deque(range(100000000))
%timeit d.popleft()
10000000 loops, best of 3: 90.5 ns per loop
l = range(100000000)
%timeit l.pop(0)
10 loops, best of 3: 93.4 ms per loop
関連
-
Python百行で韓服サークルの画像クロールを実現する
-
[解決済み] staticmethodとclassmethodの違いについて
-
[解決済み] 複数の例外を1行でキャッチする(ブロックを除く)
-
[解決済み] callとapplyの違いは何ですか?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] 割り当て後にリストが予期せず変更されました。その理由と防止策を教えてください。
-
[解決済み] リストにおけるdel、remove、popの違いについて
-
[解決済み】__str__と__repr__の違いは何ですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ピロウズ画像色処理の具体的な活用方法
-
opencvとpillowを用いた顔認証システム(デモあり)
-
python call matlab メソッドの詳細
-
Python jiabaライブラリの使用方法について説明
-
Pythonを使って簡単なzipファイルの解凍パスワードを手作業で解く
-
Pythonショートビデオクローラーチュートリアル
-
[解決済み】csv.Error:イテレータはバイトではなく文字列を返すべき
-
[解決済み] 'DataFrame' オブジェクトに 'sort' 属性がない
-
[解決済み】LogisticRegression: Pythonでsklearnを使用して、未知のラベルタイプ: '連続'を使用しています。
-
[解決済み】SyntaxError: デフォルト以外の引数がデフォルトの引数に続く