Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中最快的置换实现_Python - Fatal编程技术网

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)):

我在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)):
                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倍左右。