![](/img/trans.png)
[英]Python regex performance: Best way to iterate over texts with thousands of regex
[英]Best way (performance-wise) to iterate over a dictionary
這表明.items()
是遍歷字典的最佳方式,因為它是 Python 的。
性能方面,以下哪個是最好的,為什么?
for key in dic: value = dic[key]
for key, value in dic.items():
for key in dic.keys(): value = dic[key]
基於 timeit 值:
要查找鍵和值,
from timeit import timeit
d = {i: i for i in range(100)}
def a():
for key in d:
d[key]
pass
def b():
for key, value in d.items():
pass
def c():
for key in d.keys():
d[key]
pass
for fn in [a, b, c]:
print(fn.__name__, timeit(fn))
Solution 1 7.8113735559999995
Solution 2 2.6758934780000008
Solution 3 5.499667492
只是為了找到鑰匙,
from timeit import timeit
d = {i: i for i in range(100)}
def a():
for key in d:
pass
def b():
for key, value in d.items():
pass
def c():
for key in d.keys():
pass
for fn in [a, b, c]:
print(fn.__name__, timeit(fn))
Solution 1 1.5981329149999999
Solution 2 2.649033456
Solution 3 1.6517934609999996
因此,要找到鍵,第一個解決方案是最快的,但是要找到鍵和值,第二個解決方案是最快的。
如果您需要鍵和值, for k, v in mydict.items():
; 迭代鍵然后查找它意味着不必要地查找您可以使用.items()
免費獲得的信息。 對於非常短的dict
,它可能比for k in mydict:
然后是查找(僅僅是因為創建項目視圖的成本非常小,可能超過幾次查找的成本),但是對於中等長度的dict
, .items()
將永遠獲勝。
如果您只需要密鑰,則for k in mydict:
for k in mydict.keys():
中的 k 大致相同,盡管后者在 Py3 中稍慢一些(由於需要構建密鑰視圖)並且可以在 Py2 上顯着變慢(它使用密鑰副本創建一個臨時list
,前一種方法直接懶惰地迭代dict
)。
這類通用計時很少有用,因為性能是由特定於相關數據、應用程序和環境的更廣泛的變量驅動的,但為了提供一些簡單的比較數據,這里有一些測試可以復制和在自己的環境中嘗試。
不出所料,只是在不訪問 dict 值的情況下進行迭代表明,除了dict.items()
運行稍稍落后之外,任何方法的性能差異都非常小,因為它正在創建鍵和值的視圖(而顯示的其他方法只是處理一個或另一個)。
from timeit import timeit
loop = """
d = dict(zip(range(1000), reversed(range(1000))))
for k in d: pass"""
print(timeit(stmt=loop, number=10000))
# 1.0733639170002789
keys = """
d = dict(zip(range(1000), reversed(range(1000))))
for k in d.keys(): pass"""
print(timeit(stmt=keys, number=10000))
# 1.0360493710004448
values = """
d = dict(zip(range(1000), reversed(range(1000))))
for v in d.values(): pass"""
print(timeit(stmt=values, number=10000))
# 1.0380961279997791
items = """
d = dict(zip(range(1000), reversed(range(1000))))
for v in d.items(): pass"""
print(timeit(stmt=items, number=10000))
# 1.2011308679993817
在訪問每個鍵的值時進行迭代以試圖平衡游戲環境,這並不奇怪表明dict.items()
當您需要迭代並訪問鍵和值時會稍微快一些。
from timeit import timeit
loop = """
d = dict(zip(range(1000), reversed(range(1000))))
for k in d: d[k]"""
print(timeit(stmt=loop, number=10000))
# 1.4128917540001567
keys = """
d = dict(zip(range(1000), reversed(range(1000))))
for k in d.keys(): d[k]"""
print(timeit(stmt=keys, number=10000))
# 1.3668724469998779
items = """
d = dict(zip(range(1000), reversed(range(1000))))
for v in d.items(): pass"""
print(timeit(stmt=items, number=10000))
# 1.1864945030001763
兩個是您的最佳選擇,原因有兩個,
1)您可以獲得鍵和值,因此您可以在需要時再次調用它來節省資源
2)就像你說的,它是“pythonic”,它是那里最快的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.