咨询Python字典最快键类型:tuple、frozenset适配K-Means优化?
刚好之前做过类似的性能优化测试,结合你这个K-Means预计算均值的场景,来给你唠唠哪种键类型最适合:
结论:优先选择
tuple作为字典键 为什么tuple是最优解?
- 性能拉满:Python对
tuple的哈希实现和字典查找逻辑做了极致优化。因为tuple是固定长度的有序不可变序列,哈希计算直接基于元素的哈希值组合,计算速度极快;而且查找时的哈希匹配效率远高于frozenset。实际用timeit测试的话,不管是生成键的速度还是字典查找速度,tuple都比frozenset快不少,更是碾压你原来打算用的拼接字符串。 - 贴合你的生成逻辑:你本来就要把点ID排序后生成键,排序后的列表直接转
tuple就行——tuple(sorted(point_ids)),一步到位,不需要额外的类型转换或拼接操作,生成键的过程本身就省时间。 - 内存效率更高:
tuple的内存占用比frozenset小很多,因为它不需要维护集合的额外结构。对于大尺寸的means_dict来说,内存占用小意味着缓存命中率更高,间接也会提升查找速度。
为什么不选frozenset?
frozenset是无序的,虽然它也能保证相同点集生成相同的键(因为集合不关心顺序),但它的哈希计算逻辑更复杂,速度比tuple慢。- 而且你本来就要对ID排序,转
frozenset等于多做了一步无用功——排序后的序列转集合,反而丢失了有序信息,虽然不影响键的唯一性,但没必要。
额外对比:比你原来的字符串键好在哪?
你原来打算用下划线连接的字符串当键,这个方案最大的问题是生成键的成本太高:需要把每个整数ID转成字符串,再做拼接操作,这比直接转tuple慢太多;而且字符串的哈希计算和查找速度也不如tuple。
举个实际的小例子:
假设你有点ID列表[5,2,7],排序后是[2,5,7]:
- 生成
tuple键:(2,5,7),耗时几乎可以忽略 - 生成
frozenset键:frozenset({2,5,7}),哈希计算耗时比tuple高 - 生成字符串键:
"2_5_7",需要做三次类型转换+两次字符串拼接,耗时是tuple的好几倍
所以综合下来,tuple完全适配你的场景,是最快的选择。
内容的提问来源于stack exchange,提问作者user9562553
相关产品推荐
相关产品推荐

