String 从一组单词生成单词排列列表

String 从一组单词生成单词排列列表,string,text,awk,permutation,words,String,Text,Awk,Permutation,Words,我有13个不同的单词。 我需要得到这些词的所有组合的排列: word1 word2 word3 word4 word5 word6 word7 word8 word9 word10 word11 word12 word13 但是这些组合应该只有12个单词长 我已经用python编写了一个脚本: 但是它太慢了,当组合只有4个单词长时需要24秒 使用a,最多9个不同的单词只需1秒;但当尝试10个不同的单词时,浏览器崩溃了 有没有一种快速有效的方法可以做到这一点?可能使用awk 编辑: 这不是同一个

我有13个不同的单词。 我需要得到这些词的所有组合的排列:

word1 word2 word3 word4 word5 word6 word7 word8 word9 word10 word11 word12 word13
但是这些组合应该只有12个单词长

我已经用python编写了一个脚本:

但是它太慢了,当组合只有4个单词长时需要24秒

使用a,最多9个不同的单词只需1秒;但当尝试10个不同的单词时,浏览器崩溃了

有没有一种快速有效的方法可以做到这一点?可能使用
awk

编辑:

这不是同一个问题,因为这个问题有13个独立的单词,而另一个线程中的答案与单词无关


问候。

反复调用
print
会使脚本速度变慢,因为每次调用都会在与要打印的系统对话时产生一些开销。如果将所有排列组合成一个字符串并打印该字符串一次,则会得到显著的改进。但即便如此,当你在屏幕上显示文本时,打印也是一项繁重的工作。只需写入文件或立即执行您计划使用这些排列执行的任何操作都要快得多

也可以进行一些较小的改进。元组是一种非常混乱的字符串表示形式:需要引号(包括检查字符串是否有自己的引号)、逗号和括号。只需将单词与空格连接起来就可以更快

更深入地说,最好是基于内置函数使循环隐式化,因为它们是用C编写的,而不是用Python编写的。例如,如果函数也是一个快速内置函数而不是Python函数(例如lambda),则
map
要比a快。如果你感兴趣,请阅读

将所有这些想法结合在一起,我们有:

with open('perms.txt', 'w') as out:
    out.write('\n'.join(map(' '.join, permutations(items, 7))))

这花了8秒时间生成了900万个长度为7的排列。

排列和组合的术语经常会出现混淆,因此让我们澄清一下您在寻找什么。假设只有三个单词:
A
B
C
,您要查找一个两个单词的组合列表。你期待哪一张名单?(1)
AB,AC,BA,BC,CA,CB
(2)
AB,AC,BC
(即顺序是无关紧要的)(3)
AA,AB,AC,BA,BB,BC,CA,CB,CC
(4)
AA,AB,AC,BB,BC,CC
(4)
AA,AB,AC,BB,BC,CC
将执行您的示例中的列表(1):这里的主要问题是将有60亿个排列,因此,即使是最有效的程序也会遇到困难,因为它不仅要生成它们,而且实际上还要处理它们。例如,在脚本中,对
print
的调用是最慢的部分。如果将它们存储在一个文件中,它们可能至少需要500 GB。你想用这些排列做什么?是的,我知道大约是300GB。我需要把它们归档。实际上我必须这么做,因为我有一个12字的比特币BIP39助记符,我不记得单词的顺序,只记得单词。有了这个文件后,我想写一个脚本,用BIP39标准检查每个文件的有效助记符。否则我的比特币就丢了:/那太酷了。第二部分是检查每个排列是否更容易编写,如果它从文件中读取,而不是直接在
下检查排列(第12项)
中的p?
如果将所有排列合并到一个字符串中并打印该字符串一次,您会得到显著的改进。
-您确定吗?由于动态字符串连接中的内存管理开销,您不会使用awk,我假设python也有…是的,
print
有相当大的开销。IO等通常是一个问题。上面的答案是通过不断的改进得到的,每个改进都是定时的。另外,我认为
join
在分配字符串之前会计算出字符串的长度,这样就不会得到重复加倍的数组。
with open('perms.txt', 'w') as out:
    out.write('\n'.join(map(' '.join, permutations(items, 7))))