10亿次排列后itertools饱和

我编写了以下代码来计算列表列表的所有排列之间获得的总和的平均值:


import numpy as np

import itertools


r = 13

c = 5

a = 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 ?


哆啦的时光机
浏览 121回答 1
1回答

MM们

您不必要地首先收集products,然后收集个人sums,当lists您也可以迭代迭代器时。您也不需要len列表,因为您可以直接计算产品的数量。res = sum(sum(e) for e in itertools.product(*a))/c**r这将消耗更少的内存,这可能会防止您的计算机死机或崩溃。然而,对于r=13和c=5,这仍然意味着测试c**r = 1,220,703,125组合,这对于 Python 来说可能太多了。但是,由于您获取的是所有产品,因此每个元素在所有产品中出现的次数相同,因此您根本不必实际计算和迭代产品。相反,您可以像这样直接计算产品的平均总和:res = sum(sum(a)) // c   # here, a is the numpy array, not the product iterator(这是针对所有元素数量相同的列表;如果列表大小不同,公式会稍微复杂一些,但仍然可以直接计算,无需任何循环。)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python