巨大的python列表和直方图绕过内存问题的结尾

时间:2019-06-14 08:39:11

标签: python list memory histogram

我必须使用庞大的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的大小,但是非常慢并且实际上不可用。你能帮我其他想法吗?有没有一种方法可以绘制“实时直方图”?谢谢!

1 个答案:

答案 0 :(得分:0)

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

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差异,因此仅计算实际需要的差异计数就可以大大减少计算量。

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