2012-12-12 13 views
9

私はネイティブのPythonリストのパフォーマンスをリンクリストの実装(例えばthis)と比較する簡単な実験を試みました。なぜPythonにネイティブリンクリスト実装がないのですか?

ネイティブのPythonリストは、(理論に基づいて)存在してはならない場合のネイティブリンクリストよりも常に高速です。上記テストに私が

from linkedlist import * 
import time 
a = LinkedList() 
b = [] 
for i in range(1000000): 
    b.append(i) 
    a.add_first(i) 
t0 = time.clock() 
a.remove(10) 
t1 = time.clock() 
b.remove(10) 
t2 = time.clock() 
print t1-t0 
print t2-t1 

結果は次のとおり

  • ネイティブリンクリスト= 2.00000000001e-05

  • Pythonリスト= 0.005576

  • 非天然のリストにリンク= 3.90000000001e-05

なぜ、PythonにネイティブのLinked Listデータ構造がないのだろうと思っていました。 Pythonの場合、標準的なライブラリのいくつかの側面をスピードアップするために、標準リストの代わりに リンクリストを持つことがアルゴリズム的には有用であると私は思っています。

私の理解では、リストデータ構造は言語の重要なビルディングブロックであり、コードをよりメンテナンスしやすくし、その非常にデータ構造に集中するように簡単に最適化できるようにします。

その他の理由はありますか?

+0

あなたのテストで2つの 'print'sと3つの結果が表示されます - あなたの"ネイティブ "リンクリストはどこから来ますか? – Eric

+1

私はさまざまな実装でテストを何回も実行しました。また、このクイックでスーパーダーティなコードをswigで構築しました。http://cl.ly/code/2A3t352q1m1Y – lc2817

+1

「なぜ開発者がリンクリストDSをPython? " p.s.私は質問がSO、おそらくProgrammers.SEに収まるように少し主観的だと思いますか? – amit

答えて

8

Pythonはネイティブの二重リンクリストであるcollections.dequeを持っています。

+0

ありがとう!あなたの情報については、collections.dequeを使った同じテストで8.00000000001e-06 – lc2817

+6

が返ってきます。 collections.dequeは頭だけでなく末尾からもアクセスできるキューです。LinkedListsの全体のポイントは、X要素の後に要素を挿入したり、Y要素を削除したりすることです。 dequeはこれらのメソッドを提供しません。 OPの質問はまだ成立します。なぜPythonにネイティブのLinkedList実装がないのですか? – Mugen

+0

@Mugenは正しいですが、collections.dequeはフードの中で二重リンクされたリストです(わかりません)が、そのインターフェイスはリンクされたリストのものではありません。範囲。だから、質問のテスト例のための良い解決策ですが、collections.dequeは、Pythonのリンクリストを必要とする問題の一般的な解決策ではありません。 – gregrf

0

これは、ビルドリストがメソッドを追加するのではなく、大半の時間を要するからです。したがって、あなたが示したように線形時間演算ではない場合、(例えば:n^2演算)appendメソッドは、見たい結果につながる建物よりも重要です。

関連する問題