【问题标题】:What is the fastest key type for the dictionaries in python? tuple, frozenset...?python中字典最快的键类型是什么?元组,frozenset ...?
【发布时间】:2018-04-30 10:33:04
【问题描述】:

上下文:我正在尝试加快 k-means 的执行时间。为此,我在 k-means 执行之前预先计算了均值。这些均值存储在一个名为 mean_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] )

【问题讨论】:

  • 你能给我们更多的背景信息吗?你想达到什么目的?当点作为整数列表给出时,为什么means_dict的字典键以给定的方式给出?
  • @IonicSolutions 我添加了上下文,请参阅问题。 Points 是一个集合或类的点 id 的列表。字典 mean_dict 有 k:v 格式,v 是字符串键 k 表示的集合的均值。
  • 感谢您编辑您的问题!我只是模糊地熟悉 k-means 算法,但我怀疑预先计算所有可能点集的平均值会加速算法。如果我正确理解了算法,最初会选择 k 个随机点集,然后对其进行更改,因此对于大多数可能的点集,永远不需要计算平均值。您是否检查过预计算计算的均值比原始 k-means 少?由于您的问题旨在改进潜在改进的实现细节:您是否尝试过改进您的手段()方法?
  • 一般来说,“哪个更快”问题的答案是“自己试试看”。在你的情况下,我建议你试试frozenset,因为它不需要排序(由你——我不知道它是否在内部排序)。
  • @IonicSolutions 我预计算只意味着那些有很大机会被 k-means 使用。我使用 Voronoi 来获取 k 个集合以预先计算均值。我看到 k-means 使用了一些预先计算的方法。当我将 k-means 的执行时间与标准 k-means 进行比较时,我发现我的 k-means 有点差,因为在 mean() method.means 和标准 k-means 中生成密钥的时间很长,我看到了由于 mean() 方法中的密钥生成时间较长,我的 k-means 稍差。

标签: python sorting data-structures cluster-analysis k-means


【解决方案1】:

计算手段很便宜。

您是否对您的程序进行了概要分析? 有多少时间用于重新计算他​​的意思?使用适当的 numpy 数组而不是 python 盒装数组,这应该非常便宜 - 绝对比构造 any 这样的键便宜!

计算密钥代价高昂的原因很简单:它意味着构造一个不同大小的对象。根据您的描述,您似乎将首先构建一个盒装整数列表,然后是一个盒装整数元组,然后将其序列化为一个字符串,然后再次复制该字符串以附加下划线。在计算实际平均值时,这不可能比简单的可向量化聚合更快...

您甚至可以使用 MacQueens 方法来更新 手段,而不是重新计算它们。但即便如此,通常也比重新计算它们要慢。

如果您的方法最终比常规 k-means 慢 10 倍,我不会感到惊讶...而且可能比 Hartigan 和 Wong 等聪明的 kmeans 算法慢 1000 倍。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 2016-06-07
    • 2019-03-17
    • 2011-01-22
    • 2012-03-03
    • 2014-03-17
    • 2018-01-25
    相关资源
    最近更新 更多