【问题标题】:Python: Is there an optimized dictionary type using multiple keys (similar to a database)?Python:是否有使用多个键的优化字典类型(类似于数据库)?
【发布时间】:2012-12-03 19:24:05
【问题描述】:

即让您可以像在数据库中一样高效地访问和更新数据。

我的具体情况如下:

我有一个非常大的蒙特卡洛模拟+优化,数据被分类到几个字典中,每个字典有 600k+ 元组键,格式如下:

simple_dictionary[(year, month, day, hour, minute)] = value_or_small_list_or_small_numpy_array

事实证明,上面的内容实际上比嵌套字典要慢一些:

simple_dictionary[year][month][day][hour][minute] = value_or_small_list_or_small_numpy_array

这让我相信——如果我错了,请纠正我——后一种格式检查的键比前一种格式少。这个假设是基于我的代码(太长而无法发布)。我的代码在__init__ 之后没有创建新的键,但每次迭代至少调用一次每个键/值对。但是,并非所有值都会更新。

假设这可以/应该从 RAM 运行,是否有比上述代码更有效的替代方法?

【问题讨论】:

  • 这里的“检查更少的键”是什么意思?
  • 对不起,我的知识相当有限,因为我不是计算机科学家,但我认为 Python 必须先进行一些内部处理才能知道数据在 RAM 中的确切位置。

标签: python performance optimization python-2.7 dictionary


【解决方案1】:

您是否考虑过尝试使用内存中的sqlite3 数据库?这将与您所能获得的“类似于数据库”一样,并且都在内存中。 :)

使用连接字符串:memory: 为您提供一个内存数据库。

【讨论】:

  • 这是我用的。有一个 python sqllite3 库,所以只需使用它。 docs.python.org/2/library/sqlite3.html
  • @DragosToader,你有机会比较吗?如果是这样,您是否获得了更好的结果?
  • 使用 sqllite3 的另一个好处是,如果数据集变得太大,您可以在没有 :memory: 连接参数的情况下进行连接。
  • 我首先将键/值的完整 Windows 注册表导出加载为字典,然后加载为 sqllite3 数据库。 sqllite3 db 比我记得的要快。不过,我不得不使用 SQL 来访问数据——这对我来说更好。在我的 (key,value) 键上创建复合索引后,它变得更快了。
  • 有趣 - 我会看看这是否适用于我的应用程序。谢谢!
猜你喜欢
  • 2017-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多