我最近詢問了創建 10 次冪的最快方法,結果證明最快的方法實際上有點偷偷摸摸,首先創建所有可能的值,然后在需要時簡單地查找它們。
在解決方案中, alist被用作查找表,但是,我剛剛了解到在查找操作方面dicts 應該更快(參見例如此處)。但是當我嘗試將 adict作為查找表時,該程序實際上更慢了:
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(
*('= ns ' % (t * 1e3) if t else ' error ' for t in ts), solution
)
print()
uj5u.com熱心網友回復:
collection[key_or_index]對于list和都是 O(1) dict。不同之處在于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() |
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/347770.html
上一篇:在一個陣列中存盤不同的函式指標?
下一篇:根據鍵在字典中查找值
