2016-02-24 2 views
2

Пусть»у вас есть один ключ в словаре А против 1 млрд ключей в словаре BPython dict: размер влияет на сроки?

алгоритмическом просмотрова оп является O (1)

Однако, фактическое время (программа времени выполнения), чтобы посмотреть разные основанный на размере dict?

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_dur и manykeys_dur?

+1

Постоянное время постоянное , –

+0

@JustinNiessner: 'dict' поиск не O (1). Это обычно * O (1). Это O (m), где 'm' - количество элементов в ковше. – Amadan

+0

@ Амадан - Я никогда не говорил, что это так, но если OP предполагает, что алгоритм O (1) (который является постоянным временем), то не должно быть разницы. –

ответ

3

Практически идентичен в тесте с малым и большим Dict:

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 

EDIT: Для вас, @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

Спасибо за дополнительное покрытие. Up-голосование. :-) – ShadowRanger

Смежные вопросы