【问题标题】:Bypass end of memory problem for huge python list and histogram绕过巨大的python列表和直方图的内存问题
【发布时间】:2019-06-14 08:39:11
【问题描述】:

我必须处理大量 python 列表:我有两个包含近 50.000 个元素的列表,我必须将第二个列表中的每个元素减去第一个元素,然后生成直方图。事实是我当然没有足够的内存来存储 50.000x50.000 个元素,所以我必须找到另一种方法。我所做的(并且适用于较短的列表)只是做每个差异并将它们存储在一个列表中,然后我用 matplotlib 直方图函数绘制,但我认为我需要像实时直方图一样生成,所以我不必存储每个差异。我试过用这种方式做一个直方图:

        for i in range (0,x):
            if ((i*H)<r<(H+i*H)):
            d[i]=d[i]+1

其中 x 是 bin 的数量,H 是 bin 的大小,但是非常慢并且实际上不可用。你能帮我想想其他的想法吗?有一种方法可以绘制一种“实时直方图”吗?谢谢!

【问题讨论】:

    标签: python list memory histogram


    【解决方案1】:

    使用Counter(来自集合),您可以动态获取差异计数,而无需存储所有差异。

    import random
    list1 = [random.randrange(1,1000) for _ in range(50000)]
    list2 = [random.randrange(1,1000) for _ in range(50000)]
    
    from collections import Counter
    counts = Counter(list2)
    
    for diff in [1,2,3,4]: # the differences to display
        count = sum(counts[v-diff] for v in list1)
        print(diff,":",count)
    
    1 : 2496311
    2 : 2496457
    3 : 2494224
    4 : 2487048
    

    它的作用是将第二个列表的不同值的计数存储在 Counter 字典中。这使您可以快速获取任何给定差值的元素对数。由于您的直方图不会一次显示 2.5G 差异,因此只需计算实际需要的差异计数,就可以大大减少计算量。

    请注意,我假设您的元素是整数值。这使得差异的值在一个范围内是可预测的。如果您的值是浮点数,则需要处理差异的范围(这会将问题带回到更简单的整数过程)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-18
      相关资源
      最近更新 更多