Мне нужно создать продукт списка itertool.permutation
генератора, и использует следующий код:itertools.product: как улучшить производительность?
def iter_version():
l = [itertools.permutations(range(10)) for _ in range(10)]
g = itertools.product(*l)
for i in g:
yield i
Но этот код является слишком медленным. Это занимает 16 секунд на моем рабочем столе. cProfile ничего не показывает, кроме как сказать мне, что эта функция занимает 16 секунд.
Если я просто создать некоторые неработоспособную петлю так:
def for_loop():
l = [itertools.permutations(range(10)) for _ in range(10)]
for i0 in l[0]:
for i1 in l[1]:
for i2 in l[2]:
for i3 in l[3]:
for i4 in l[4]:
for i5 in l[5]:
for i6 in l[6]:
for i7 in l[7]:
for i8 in l[8]:
for i9 in l[9]:
yield (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9)
Это работает почти мгновенно.
В моей ситуации список генераторов перестановок не является фиксированным размером, поэтому я не могу использовать версию цикла for.
спасибо @ DSM. 'next (iter_version())' занимает 16 секунд на моем рабочем столе. Я нахожу эту ошибку в треевом выпуске Python: http://bugs.python.org/issue10109, что 'itertools.product' преобразует итерируемый список в список, а не позже. – yegle
Я нашел решение для своего конкретного случая использования, и я опубликую его ниже. – yegle