Python中最快的置换实现
我在python中实现了以下置换生成:Python中最快的置换实现,python,Python,我在python中实现了以下置换生成: def perms(v): ''' Generates permutations for sequence v :param v: sequence for permutations ''' if not v: yield () else: for p in perms(v[1:]): for i in range(len(v)):
def perms(v):
'''
Generates permutations for sequence v
:param v: sequence for permutations
'''
if not v:
yield ()
else:
for p in perms(v[1:]):
for i in range(len(v)):
yield p[:i] + (v[0],) + p[i:]
它比itertools.permutations工作得更快(我知道,它也做得更少)。是否有更快(或者更紧凑)的实现。我试着用矢量插入/删除来实现它,但速度似乎较慢
>>> timeit.timeit("sum([1 for i in permutations([1, 2, 3, 4, 5])])", setup="from itertools import permutations", number=1000)
0.0829811965812155
>>> timeit.timeit("sum([1 for i in perms([1, 2, 3, 4, 5])])", setup="from test import perms", number=1000)
0.4672438746438843
在这个简单的示例中,您的实现似乎慢了5倍多。我遗漏了什么吗?
s/iterable/sequence/g
同意。但这并没有使它更快…:-)您可以使用开始索引而不是切片v
。这应该可以避免内存分配,这可能有助于提高性能。我将其与itertools.permutations进行了比较,您的实现要慢4到10倍。对于什么输入,它比itertools实现快?我必须支持jorgeca。我刚刚尝试了长度为8的输入和itertools。排列快25倍。(我的建议似乎没有改善时间性能;它几乎和以前一样快,但它将额外的内存使用从O(n^2)减少到O(n)),我认为,要分析生成器,最好使用collections import deque中的;deque(the_generator(),0)
,因为这是使用iterable的最快方法,而且不会消耗额外的内存,也不会对结果执行其他操作。在这种特定情况下,使用deque
比使用sum
快4倍左右。