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

10亿次排列后itertools饱和

10亿次排列后itertools饱和

哆啦的时光机 2023-05-23 15:52:28
我编写了以下代码来计算列表列表的所有排列之间获得的总和的平均值:import numpy as npimport itertoolsr = 13c = 5a = np.arange(r*c).reshape(r, c)a = list(itertools.product(*a))res = sum([sum(e) for e in a])/len(a)代码崩溃,因为 r 似乎有点太大,itertools/python 无法处理它。有没有其他方法可以在不让代码崩溃的情况下计算res ?
查看完整描述

1 回答

?
MM们

TA贡献1886条经验 获得超2个赞

您不必要地首先收集products,然后收集个人sums,当lists您也可以迭代迭代器时。您也不需要len列表,因为您可以直接计算产品的数量。

res = sum(sum(e) for e in itertools.product(*a))/c**r

这将消耗更少的内存,这可能会防止您的计算机死机或崩溃。然而,对于r=13c=5,这仍然意味着测试c**r = 1,220,703,125组合,这对于 Python 来说可能太多了。

但是,由于您获取的是所有产品,因此每个元素在所有产品中出现的次数相同,因此您根本不必实际计算和迭代产品。相反,您可以像这样直接计算产品的平均总和:

res = sum(sum(a)) // c   # here, a is the numpy array, not the product iterator

(这是针对所有元素数量相同的列表;如果列表大小不同,公式会稍微复杂一些,但仍然可以直接计算,无需任何循环。)


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

添加回答

举报

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