Python 10亿次置换后的Itertools饱和度
我编写了以下代码来计算列表的所有排列之间获得的和的平均值:Python 10亿次置换后的Itertools饱和度,python,itertools,Python,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而不让代码崩溃?您不必
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而不让代码崩溃?您不必要地首先收集
产品
,然后在列表
中单独的求和
,这时您可以迭代迭代器。您也不需要列表的len
,因为您可以直接计算产品的数量
res = sum(sum(e) for e in itertools.product(*a))/c**r
这将消耗更少的内存,这可能使您的计算机不会冻结或崩溃。然而,对于r=13
和c=5
,这仍然意味着测试c**r=1220703125
组合,这对于Python来说可能太多了
但是,由于您获得的是所有产品,因此每个元素在所有产品中出现的次数相同,因此您根本不必实际计算和迭代产品。相反,您可以直接这样计算乘积的平均和:
res = sum(sum(a)) // c # here, a is the numpy array, not the product iterator
(这适用于具有相同元素数量的所有列表;如果列表具有不同的大小,则公式会稍微复杂一些,但仍然可以不使用任何循环直接计算。)您不需要首先收集
产品,然后,中的单个求和
列出
,此时您也可以迭代迭代器。您也不需要列表的len
,因为您可以直接计算产品的数量
res = sum(sum(e) for e in itertools.product(*a))/c**r
这将消耗更少的内存,这可能使您的计算机不会冻结或崩溃。然而,对于r=13
和c=5
,这仍然意味着测试c**r=1220703125
组合,这对于Python来说可能太多了
但是,由于您获得的是所有产品,因此每个元素在所有产品中出现的次数相同,因此您根本不必实际计算和迭代产品。相反,您可以直接这样计算乘积的平均和:
res = sum(sum(a)) // c # here, a is the numpy array, not the product iterator
(这适用于具有相同元素数的所有列表;如果列表具有不同的大小,则公式会稍微复杂一些,但仍然可以直接计算而不使用任何循环。)报告“代码崩溃”时,请提供确切的堆栈跟踪和异常消息。无论如何,这看起来像是一个编码挑战,这最终不需要任何迭代。应该可以直接从r
和c
计算结果。报告“代码崩溃”时,请提供准确的堆栈跟踪和异常消息。无论如何,这看起来像是一个编码挑战,最终不需要任何迭代。应该可以直接从r
和c
计算结果。