根据一组单词生成单词排列列表



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

word1 word2 word3 word4 word5 word6 word7 word8 word9 word10 word11 word12 word13

但是组合词的长度应该只有12个单词。

我已经有了在python:中执行此操作的脚本

import time
start = time.time()
items = ['word1', 'word2', 'word3', 'word4', 'word5', 'word6', 'word7', 'word8', 'word9', 'word10, 'word11', 'word12', 'word13']
from itertools import permutations
for p in permutations(items, 12):
        print(p)
print 'It took', time.time()-start, 'seconds.'

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

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

有没有一种快速有效的方法来做到这一点?也许用awk

编辑:

这与使用bash生成排列不同,因为这个问题有13个分开的单词,而另一个线程中的答案不适用于单词。

谨致问候。

重复调用print会使脚本速度变慢,因为每次调用都会与要打印的系统进行通信,因此会产生一些开销。如果将所有排列集中到一个字符串中并打印一次该字符串,则会得到显着改进。但即便如此,当你在屏幕上显示文本时,打印也是一项艰巨的工作。只写一个文件或立即用这些排列做任何你计划做的事情会快得多。

还有一些较小的改进也可以进行。元组是一个非常混乱的字符串表示:您需要引号(包括检查字符串是否有自己的引号)、逗号和括号。只是用空格连接单词会更快。

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

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

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

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

最新更新