2016-10-02 124 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

作爲對最近編輯的迴應,從dict_setup(0.056)開始,我比list_setup(0.061)還要快。運行Python 3.5.1,英特爾Lynnfield,Windows x64 – dtgq

+0

那麼,我能說什麼?你應該解釋你期望'list.append'更快的原因。我不認爲這是一個合理的期望。 – wim

相關問題