![](/img/trans.png)
[英]Python Dictionaries : Using Tuple as a key, getting error 'unhashale type : list'
[英]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.