2013-07-21 3 views
-3

У меня есть следующие реализации для генерации перестановок в 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)): 
       yield p[:i] + (v[0],) + p[i:] 

Он работает быстрее, чем itertools.permutations (это также делает менее, я знаю). Существует ли более быстрая (или, альтернативно, более компактная) реализация. Я попытался реализовать его с помощью vector insert/delete, и он выглядит медленнее.

+0

's/iterable/sequence/g' – delnan

+0

Согласовано. Но это не делает его быстрее ... :-) – Telek

+0

Вместо нарезания 'v' вы можете использовать индекс начала. Это должно избегать выделения памяти, которое может немного помочь функциям. – Bakuriu

ответ

4
>>> 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 раз медленнее на этом простом примере. Я что-то упускаю?

+2

Я считаю, что для генераторов профилей лучше использовать 'from collections import deque; deque (the_generator(), 0) ', поскольку это самый быстрый способ использования итерации, а также не требует дополнительной памяти и не выполняет дополнительных операций с результатами. В этом конкретном случае использование 'deque' примерно в 4 раза быстрее, чем использование' sum'. – Bakuriu

+0

Да. Ты прав. Я измерил неправильную вещь ... :-) – Telek

Смежные вопросы