为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

浮云间 2022-03-05 13:12:18
我必须使用大量的 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 回答

?
GCT1015

TA贡献1827条经验 获得超4个赞

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


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


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


查看完整回答
反对 回复 2022-03-05
  • 1 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信