簡體   English   中英

迭代字典的最佳方式(性能方面)

[英]Best way (performance-wise) to iterate over a dictionary

表明.items()是遍歷字典的最佳方式,因為它是 Python 的。

性能方面,以下哪個是最好的,為什么?

  1.  for key in dic: value = dic[key]
  2.  for key, value in dic.items():
  3.  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.

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