【问题标题】:Memory saving alternatives to Counter tuple keys splitting计数器元组键拆分的内存节省替代方案
【发布时间】:2015-09-10 10:04:50
【问题描述】:

输入是一个字符串元组列表,我需要一个计数

  • 每个字符串元组出现多少次
  • 字符串元组的一个元素出现了多少次
  • 字符串元组的其他元素出现了多少次

我目前正在这样做:

>>> from collections import Counter
>>> data = [('foo','bar'), ('foo', 'bar'), ('foo', 'doo'), ('joo', 'doo'), ('koo', 'lar')]
>>> datacount = Counter(data)
>>> datacount
Counter({('foo', 'bar'): 2, ('joo', 'doo'): 1, ('koo', 'lar'): 1, ('foo', 'doo'): 1})
>>> x, y = zip(*datacount.keys())
>>> x
('joo', 'foo', 'koo', 'foo')
>>> y
('doo', 'bar', 'lar', 'doo')
>>> xcount = Counter(x)
>>> ycount = Counter(y)
>>> xcount
Counter({'foo': 2, 'koo': 1, 'joo': 1})
>>> ycount
Counter({'doo': 2, 'bar': 1, 'lar': 1})

但我意识到它占用了三个单独的计数器。 除了获取计数和其他我可以轻松获取计数的数据结构之外,还有其他方法吗?

【问题讨论】:

  • 这有什么低效的?

标签: python memory-management tuples hashtable counter


【解决方案1】:

如果您想保留 X、Y 和 X*Y 的预计算计数,则无法为每个可能的 X、Y 和 X*Y 保留一个值,并且您当前的解决方案与任何解决方案一样好。

如果您使用 3 个单独的 Counter 对象让您感到困扰,您可以将所有计数保存在一个 Counter 中,尽管它不会减少内存使用量。

如果不需要预先计算并加载到内存中,您可以:

  • 保留“指针”而不是对象 - 如果实际字符串非常大并且您希望避免将它们加载到内存中,您可以为每个字符串分配一个 id,保留 id 的计数并仅映射回必要时使用字符串。
  • 延迟加载/计数 - 您可以维护每个字符串到它出现在磁盘上的元组的映射,并通过仅加载相关元组来计算需求,即:

def count(x,y):
    X = load_tuples(x)
    Y = load_tuples(y)
    XY = [t for t in X if t[1] == y]
    return map(len,[X,Y,XY])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 2015-11-27
    • 2017-01-16
    相关资源
    最近更新 更多