2016-02-24 39 views
2

讓我們說你有在字典中的一個關鍵VS在字典中乙1個十億鍵Python字典:大小影響時間?

算法上查找op是O(1)

然而,實際的時間(程序執行時間)來查找不同基於字典的大小?

onekey_stime = time.time() 
print one_key_dict.get('firstkey') 
onekey_dur = time.time() - onekey_stime 

manykeys_stime = time.time() 
print manykeys_dict.get('randomkey') 
manykeys_dur = time.time() - manykey_stime 

我會看到onekey_durmanykeys_dur之間的時間差?

+1

固定時間常數。 –

+0

@JustinNiessner:'字典'查找不是O(1)。它通常是* O(1)。它是O(m),'m'是桶中物品的數量。 – Amadan

+0

@Amadan - 我從來沒有說過,但如果OP假設算法是O(1)(這是恆定的時間),那麼應該沒有區別。 –

回答

3

與小型和大型字典測試差不多相同:

In [31]: random_key = lambda: ''.join(np.random.choice(list(string.ascii_letters), 20)) 

In [32]: few_keys = {random_key(): np.random.random() for _ in xrange(100)} 

In [33]: many_keys = {random_key(): np.random.random() for _ in xrange(1000000)} 

In [34]: few_lookups = np.random.choice(few_keys.keys(), 50) 

In [35]: many_lookups = np.random.choice(many_keys.keys(), 50) 

In [36]: %timeit [few_keys[k] for k in few_lookups] 
100000 loops, best of 3: 6.25 µs per loop 

In [37]: %timeit [many_keys[k] for k in many_lookups] 
100000 loops, best of 3: 7.01 µs per loop 

編輯:對於你來說,@ShadowRanger - 錯過查找是相當接近太:

In [38]: %timeit [few_keys.get(k) for k in many_lookups] 
100000 loops, best of 3: 7.99 µs per loop 

In [39]: %timeit [many_keys.get(k) for k in few_lookups] 
100000 loops, best of 3: 8.78 µs per loop 
+0

注意:正確的測試需要檢查命中和未命中;對於失敗的查找,所需的探測器數量通常更高[根據此錯誤跟蹤器條目]。(https://bugs.python.org/issue10408#msg121139) – ShadowRanger

+0

感謝您的額外報道。上投了反對票。 :-) – ShadowRanger