【问题标题】:python dictionary with constant value-type具有常量值类型的python字典
【发布时间】:2011-02-25 21:48:40
【问题描述】:

我遇到了一个需要大(=巨大)python 字典的情况,这变得非常消耗内存。 但是,由于所有值都是单一类型(长) - 以及键,我想我可以使用 python(或 numpy,并不重要)数组作为值;并用一个对象包装所需的接口(in: x ; out: d[x]),该对象实际上使用这些数组来存储键和值。

我可以使用索引转换对象(输入 --> 索引,为 1..n,其中 n 是不同值计数器),并返回数组 [索引]。我可以详细说明如何以合理的内存要求实现这种索引方法的一些技术,它可以工作,甚至非常好。 但是,我想知道在任何包(我检查了集合和一些 Google 搜索)中是否已经存在这样的数据结构对象(在 python 中,或从 C/++ 包装到 python)。

欢迎评论,谢谢。

【问题讨论】:

  • 如果你还没有这样做,你应该考虑使用元组而不是列表; Python 没有普通的“数组”,但元组肯定更节省内存,因为它不为插入保留空间。然而,由于哈希表,字典仍然会占用内存,因此您可能需要考虑使用排序数据结构并使用二进制搜索来查找所需的键,该键映射到元组的索引。
  • 你为什么要考虑纯 Python 实现?是否值得寻找任何已实施索引的开箱即用键值存储解决方案,例如东京内阁?

标签: python arrays data-structures dictionary


【解决方案1】:

这种任务是典型的数据库类型访问(给定类型的列中的大量数据)。您将创建一个带有索引键的简单表,以便快速访问。我没有这方面的经验,但您可能想查看标准的 sqlite3 模块。

如果您的密钥不随时间变化,您也可以将所有数据放入两个 Python 内存优化数组(标准 array 模块);一个数组包含排序的键,另一个数组包含相应的值。然后您可以通过优化的bisect.bisect 函数找到关键索引。

【讨论】:

    【解决方案2】:

    您可以尝试使用 std::map。 Boost.Python 为 std::map 提供了开箱即用的 Python 包装。

    【讨论】:

      猜你喜欢
      • 2019-03-10
      • 2016-04-23
      • 2014-06-07
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多