【问题标题】:memory efficient data structures in pythonpython中的内存高效数据结构
【发布时间】:2015-07-27 21:50:00
【问题描述】:

我有大量相同的字典(结构相同:相同的键,不同的值),这会导致两个不同的内存问题:

  • 字典呈指数级扩展,因此每个字典最多可以使用两倍的内存。

  • 字典需要记录它们的标签,因此每个字典都在存储该字典的键,这会占用大量内存。

有什么好的方法可以共享标签(所以每个标签都不存储在对象中),并压缩内存?

【问题讨论】:

  • 让我们从一个显而易见的问题开始:为什么会有“大量相同的字典”?如果它们相同,为什么需要多个?
  • 对不起,当我说相同的字典时,我指的是结构,而不是内容。它们都有相同的键,但值不同。我会更新帖子。
  • 在这种情况下,只构建一个字典,其中每个项目都是一个列表。
  • 同样,为什么你需要几个不同的字典而不是每个键指向所有值列表的字典?言归正传,我怀疑是XY issue,我想知道 X 是什么让你想到了这个 Y。
  • @CasimiretHippolyte:这不太理想。从列表中间删除一个元素(这种情况经常发生)会导致问题。

标签: python-3.x memory data-structures


【解决方案1】:

基于recordclass库,可能会提供以下解决方案:

pip install recordclass

>>> from recordclass import make_dataclass

为给定的标签集创建一个类:

>>> DataCls = make_dataclass('DataCls', 'first second third')
>>> data = DataCls(first="red", second="green", third="blue")
>>> print(data)
DataCls(first="red", second="green", third="blue")
>>> print('Memory size:', sys.getsizeof(data), 'bytes')
Memory size: 40 bytes

它很快并且占用最少的内存。适合创建数百万个实例。

缺点:它是 C 扩展,不在标准库中。但在 pypi 上可用。

补充:recordclass 0.15 版本开始,有一个选项fast_new 可以更快地创建实例:

>>> DataCls = make_dataclass('DataCls', 'first second third', fast_new=True)

如果不需要关键字参数,那么实例创建将被加速两次。

P.S.:记录类库的作者在这里。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-20
    • 2015-06-26
    • 2020-08-22
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多