簡體   English   中英

提高Python中非常大的字典的性能

[英]Improving performance of very large dictionary in Python

我發現如果我在開頭初始化一個空字典,然后在for循環中向字典添加元素(大約110,000個鍵,每個鍵的值是一個列表,也在循環中增加),速度下降為for循環去。

我懷疑問題是,字典在初始化時並不知道密鑰的數量而且它沒有做一些非常聰明的事情,所以也許存儲沖突變得非常頻繁而且速度變慢。

如果我知道密鑰的數量以及這些密鑰究竟是什么,那么在python中是否有任何方法可以使dict(或哈希表)更有效地工作? 我依稀記得,如果你知道密鑰,你可以巧妙地設計哈希函數(完美哈希?)並預先分配空間。

如果我知道密鑰的數量以及這些密鑰究竟是什么,那么在python中是否有任何方法可以使dict(或哈希表)更有效地工作? 我依稀記得,如果你知道密鑰,你可以巧妙地設計哈希函數(完美哈希?)並預先分配空間。

Python沒有公開預先調整大小的選項來加速字典的“增長階段”,也沒有提供對字典中“放置”的任何直接控制。

也就是說,如果密鑰總是事先知道,您可以將它們存儲在一個集合中,並使用dict.fromkeys()從集合中構建字典。 該類方法經過優化,可根據設置的大小預先調整字典大小 ,並且可以填充字典而無需對__hash __()進行任何新調用:

>>> keys = {'red', 'green', 'blue', 'yellow', 'orange', 'pink', 'black'}
>>> d = dict.fromkeys(keys)  # dict is pre-sized to 32 empty slots

如果減少碰撞是您的目標,您可以在字典中的插入順序上運行實驗,以最大限度地減少堆積。 (看看布倫特在Knuth的TAOCP中對算法D的變化,以了解如何完成此操作)。

通過為字典(例如這個 )設置純Python模型,可以計算替代插入順序的加權平均探測數。 例如,插入dict.fromkeys([11100, 22200, 44400, 33300])平均每次查找1.75個探測器。 這比dict.fromkeys([33300, 22200, 11100, 44400])每次查找的平均探測次數dict.fromkeys([33300, 22200, 11100, 44400]) 2.25。

另一個“技巧”是通過欺騙它增加其大小而不添加新密鑰來增加完全填充的字典中的備用:

 d = dict.fromkeys(['red', 'green', 'blue', 'yellow', 'orange'])
 d.update(dict(d))     # This makes room for additional keys
                       # and makes the set collision-free.

最后,您可以為您的鍵引入自己的自定義__hash __(),目的是消除所有沖突(可能使用完美的哈希生成器,如gperf )。

暫無
暫無

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

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