簡體   English   中英

python中字典的最快鍵類型是什么? 元組,frozenset…?

[英]What is the fastest key type for the dictionaries in python? tuple, frozenset…?

上下文:我正在嘗試加快k均值的執行時間。 為此,我在k均值執行之前預先計算了均值。 這些均值存儲在名為means_dict的字典中,該字典具有一個鍵,該鍵將按順序升序排列的點ID序列,然后通過下划線連接,並將這些點的平均值作為值。 當我想在k-means執行過程中訪問dict_mean字典中給定點的均值時,我必須生成該點集的鍵,即按升序對id點進行排序,並通過下划線將它們連接起來。 密鑰生成指令需要很長時間,因為密鑰可能包含數千個整數。

對於每個鍵,我在字典中都有一個由下划線“-”分隔的整數序列。 為了使鍵唯一,我必須對下划線之前的整數序列進行排序,最后確定一個字符串鍵。 問題是這個過程太長了。 我想使用另一種類型的鍵,該鍵可以避免對序列進行排序,並且在訪問,比較和搜索方面,該鍵類型應比字符串類型快。

 # means_dict is the dictionary containing as a key a string (sequence of 
 # integers joined by underscore "-", for example key="3-76-45-78-344")
 # points is a dictionary containing for each value a list of integers
 for k in keys:
     # this joining instruction is so long       
     key = "_".join([ str(c) for c in sorted(points[k])])        
     if( key in means_dict ):
         newmu.append( means_dict[key] )

計算手段很便宜。

您是否對程序進行了簡介? 他指的是多少時間用於重新計算? 使用適當的numpy數組而不是python盒裝數組,這應該非常便宜-絕對比構造任何此類鍵便宜!

計算密鑰很昂貴的原因很簡單:這意味着構造一個大小可變的對象。 根據您的描述,似乎您將首先構建一個裝箱的整數列表,然后構建一個裝箱的整數元組,然后將其序列化為字符串,然后再次復制該字符串以附加下划線。 在計算實際均值時,這不可能比簡單的可矢量化聚合更快。

您甚至可以使用MacQueens方法來更新均值,而不用重新計算它們。 但這甚至比重新計算它們還要慢。

如果您的方法最終比常規k均值慢10倍,並且可能比聰明的kmeans算法(例如Hartigan和Wong's)慢1000倍,我不會感到驚訝。

暫無
暫無

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

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