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

时间:2016-04-17 15:33:43

标签: string text awk permutation words

我有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 tool,最多9个不同的单词只花了1秒钟;但是当尝试10个不同的单词时,浏览器崩溃了。

有一种快速有效的方法吗?也许与awk

编辑:

这与Generating permutations using bash不是同一个问题,因为这个问题有13个单独的单词,而另一个主题中的答案不适用于单词。

亲切的问候。

1 个答案:

答案 0 :(得分:0)

反复调用print会使脚本变慢,因为每次调用都会有一些开销,因为它会与要打印的系统进行通信。如果将所有排列组合成一个字符串并打印该字符串一次,您将获得显着改进。但即使这样,当你在屏幕上显示文字时,打印也是很多工作。只需写入文件或立即执行您计划使用这些排列的任何内容,速度会快得多。

还可以进行较小的改进。元组是一个非常混乱的字符串表示形式:你需要引号(包括检查字符串是否有自己的引号),逗号和括号。只需用空格加入单词就更快了。

更深入一点,最好是基于内置函数隐式循环,因为它们是用C语言编写的,而不是用Python编写的循环。例如,map比理解更快,如果该函数也是快速内置函数而不是Python函数(例如lambda)。如果您有兴趣,请阅读this

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

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

这需要8秒钟才能产生900万个长度为7的排列。