簡體   English   中英

為什么在這種情況下字典查找速度不快?

[英]Why is the dictionary lookup not faster in this case?

我最近詢問了創建 10 次冪的最快方法,結果證明最快的方法實際上有點偷偷摸摸,首先創建所有可能的值,然后在需要時簡單地查找它們。

在解決方案中,一個list被用作查找表,但是,我剛剛了解到當涉及到查找操作時, dicts應該快得多(參見例如這里)。 但是當我嘗試使用dict作為查找表時,這個過程實際上變慢了

n = 200
 18 ns   18 ns   18 ns  f[n]  # list
 22 ns   22 ns   22 ns  g[n]  # dict

n = -200
 18 ns   18 ns   18 ns  f[n]  # list
 29 ns   29 ns   29 ns  g[n]  # dict

這是為什么? 它與keys是整數而不是字符串的事實有關嗎? (另外我猜在這種情況下不能使用sets ?)

這是我運行的代碼:

from timeit import repeat


solutions = [
    'f[n]  # list',
    'g[n]  # dict',
]

for n in 200, -200:
    print(f'n = {n}')
    setup = f'''
n = {n}
f = [10.0 ** i for i in [*range(309), *range(-323, 0)]]
g = {{i: 10.0 ** i for i in range(-323, 309)}}
'''
    for solution in solutions:
        try:
            ts = sorted(repeat(solution, setup, repeat=50))[:3]
        except OverflowError:
            ts = [None] * 3
        print(
            *('%3d ns ' % (t * 1e3) if t else ' error ' for t in ts), solution
        )
    print()

collection[key_or_index]對於listdict都是 O(1) 。 不同的是key_or_value in collection的表現。

這是“我的列表中十的i次方是多少?”之間的區別。 與“ x是我列表中的 10 的冪嗎?”

列表的索引速度稍快,因為字典需要計算其鍵的哈希值,並檢查沖突。


混淆是因為“查找”既可以指索引操作,也可以指檢查是否存在,具體取決於上下文。


下面概述了如何在列表和字典中執行等效操作:

列表 字典
索引 lst[i] dct[key]
檢查鍵/索引的存在 -len(lst) <= i < len(lst) key in dct
檢查值的存在 value in lst value in dct.values()
循環值 for value in lst for value in dct.values()
循環鍵/索引 for i in range(len(lst)) for key in dct
遍歷兩者 for i, value in enumerate(lst) for key, value in dct.items()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM