【问题标题】:Fastest data structure for numerically indexed data structure?数字索引数据结构的最快数据结构?
【发布时间】:2015-07-02 00:51:37
【问题描述】:

我正在使用常规的 python 2.79,并且只想使用标准库。我想创建一个基本上是二维数组的东西,其中二维引用的每个单元格将指向一个杂项数据的小字典。我想要最快的方式来访问包含字典的单元格。数据将有两个整数索引,我可以通过它们引用每个单元格。我已经知道 x 和 y(我们称它们为..)

1) x 和 y 元素的允许值介于 -58600 和 +58600 之间。

2) 不是每个单元格都会包含信息,但我需要通过数字 x,y 索引快速查找并获取单元格数据。

3) 数据单元格的内容可以是任何大小或配置,并且随着我升级代码或包含新参数等可能会随着时间而改变。

我的第一个想法是这样的嵌套字典

dictionary_structure[x][y]["data"] 

会查找数据 .. 或测试是否存在

if "data" in dictionary_structure[x][y]:

我应该使用哪种数据结构来进行最快的查找?

【问题讨论】:

    标签: python arrays dictionary


    【解决方案1】:

    我认为如果你只有一个顶级字典,而不是每个维度一个,性能会提高。以下是几种可能性:

    使用元组:

    if (x, y) in dictionary_structure:
        print(dictionary_structure[(x, y)]["data"])
    

    将一个坐标乘以它的可能值的数量,然后添加到另一个(您的键现在是整数;乘法确保xy 的唯一组合不会成为相同的键 - 但要将密钥计算封装在一个函数中;您还可以使用除法和取模从密钥中提取 x 和 y):

    key = 117201 * x + y
    if key in dictionary_structure:
        print(dictionary_structure[key]["data"])
    

    我不知道在你的情况下哪一个会更快;你需要自己测量。

    【讨论】:

      【解决方案2】:

      最内层的布隆过滤器。以下是一些实现:

      https://github.com/bitly/dablooms

      https://github.com/axiak/pybloomfiltermmap

      https://bitbucket.org/crankycoder/hydra/src

      处理速度非常快,由于内部散列技术,数据大小无关紧要。但是存在误报 - 因此您需要验证这是否适合您的确切问题。

      【讨论】:

      • 误报?这到底是什么意思?当我查找 37,42 时,它会像给我 34,56 单元格一样“混淆”单元格吗?或者告诉我 37,42 单元格没有数据等?
      • 误报意味着它可能会说即使不存在特定的“数据”(尽管很少)。检查en.wikipedia.org/wiki/Bloom_filter
      • 但是如果“data”存在,肯定会返回true。
      • 我要求没有非标准库的 Python...?我不能使用添加类型的东西。必须是我能写的直接python代码......什么样的结构最快。
      猜你喜欢
      • 1970-01-01
      • 2012-02-18
      • 2014-09-10
      • 1970-01-01
      • 1970-01-01
      • 2013-04-21
      • 2011-11-16
      • 2012-01-26
      • 1970-01-01
      相关资源
      最近更新 更多