我想创建一个数组,该数组存储n个数字上所有可能的排序。有什么有效的方法可以在Python 3中创建这样的数组吗?
例如,当n为20时,应该为20!此数组中的元素。
答案 0 :(得分:3)
有效的方法,可能实用,不行。
生成内存中的列表效率不高,正如您所说的那样,列表的长度为20!
个元素,每个元素都是20个项目的列表。假设每个元素的最佳情况是1个字节,并且没有开销,那么我们的数组将消耗20 x 20!
个RAM字节,大约42 exabytes
@ user8408080建议使用一个生成器,该函数可以生成每个元素,但一次只能生成一个,因此可以对其进行处理而不必将整个列表存储在ram中,@ njzk2建议使用itertools,permutations
方法可能会做您想要的:
itertools.permutations([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20])
或更简单地说:
itertools.permutations(range(1,21))
下一个问题,这将产生20个!结果,每秒处理10,000,000
可能是可行的(尽管您还没有指定此列表将要执行的操作),因为这将花费20! / 10^7
秒,大约需要7,000年。
假设有一个更“有效”的方法,我们可以减少这个数字,但是我认为它仍然不实用。
import itertools
def process(l):
#Do some processing
return l
def iterate_permutations(n):
for l in itertools.permutations(range(1,n+1)):
process(l)
iterate_permutations(10)
您可能必须考虑重新定义问题或对其进行优化,以便不必依次处理所有可能的排列。根据问题的不同,可能会有一些数学或逻辑原理可以帮助您。