2016-10-02 7 views
4
>>> timeit.timeit('test.append("test")', setup='test = []') 
0.09363977164165221 
>>> timeit.timeit('test[0] = ("test")', setup='test = {}') 
0.04957961010914147 

は私もループして再び試みたが、同じこと:ディクショナリがPythonのリストより速いのはなぜですか?

>>> timeit.timeit('for i in range(10): test.append(i)', setup='test = []') 
1.3737744340367612 
>>> timeit.timeit('for i in range(10): test[i] = i', setup='test = {}') 
0.8633718070233272 

なぜリストに遅いのですか?

+2

おそらくあなたは自分自身に質問する必要があります:なぜあなたはリストがより速くなると期待していますか? – Wboy

+2

@Wboyなぜ私はそれを自分自身に尋ねるでしょうか? – dtgq

+0

@DavidTanあなたは「私はリストがもっと速くなることを期待しています」と書きました。ここで一般的なPythonの実装に固有のものに答えるよりも、その特定の期待に反論する方が簡単かもしれません。 – viraptor

答えて

4

まず、list.appenddict.__setitem__は両方ともO(1)平均の場合です。もちろん、それらは異なる係数を持つでしょうが、どちらか一方がより速くなると言うブランケットの理由は本当にありません。係数は実装の詳細によっても変わることがあります。

第二に、より公平な比較は、属性解像度のオーバーヘッドを削除するには、次のようになります。

>>> timeit.timeit('test[0] = ("test")', setup='test = {}') 
0.0813908576965332 
>>> timeit.timeit('test_append("test")', setup='test = []; test_append = test.append') 
0.06907820701599121 

インスタンス上のメソッド名のルックアップは、あなたのような、非常に安価な操作を見ているとき、比較的高価ですappend

また、一度内部にデータがあると、一貫して少し速くなっています。この例はpython 3.5.2です:

>>> dict_setup = 'import random; test = {random.random(): None for _ in range(1000)}' 
>>> list_setup = 'import random; test = [random.random() for _ in range(1000)]; test_append=test.append' 
>>> timeit.timeit('test[0] = "test"', setup=dict_setup) 
0.06155529400166415 
>>> timeit.timeit('test_append("test")', setup=list_setup) 
0.057089386998995906 
+0

私はそれを実行しようとしましたが、[]では0.063、{}では0.047を得ています。しかし、あなたが正しいです、それは.append()の0.094から改良を行いました。質問はまだ残っていますが、リストはまだ遅いです(私にとっては少なくとも) – dtgq

+0

最新の編集に対応して、list_setup(0.061)よりもdict_setup(0.056)の方が速いです。 Python 3.5.1、Intel Lynnfield、Windows x64を実行している – dtgq

+0

さて、どうすればいいですか? 'list.append'がより速くなると期待している理由を説明する必要があります。私はそれが合理的な期待だとは思わない。 – wim

関連する問題