У меня есть три упорядоченные списки, examplewiseОптимизировать питон алгоритм
a, b, c = [10,9,8], [9,8,7], [13,5,1]
Я хочу, чтобы получить все комбинации x, y, z
где x in a, y in b and z in c
и 1/x + 1/y + 1/z < 1
в кратчайшие сроки. Я пытался несколько различных подходов,
for x, y, z in product(a, b, c):
if predicative(x,y,z):
yield (x, y, z)
Очевидно, что это занимает слишком много времени, учитывая, что я буду проверять все, и списки a, b, c
уже отсортированы. Я попробовал сортировку product(a,b,c)
на sum
, но это нереально медленное, так как оно использует все продукты. Мой первоначальный план с сортировкой a, b and c
- это то, что я мог вырваться из цикла, как только один не удался. Есть идеи?
Спасибо.
Вы считали ['itertools.takewhile'] (https://docs.python.org/2/library/itertools.html#itertools.takewhile)? Чистая эквивалентная реализация Python - это ваш текущий подход плюс две строки ('else: break'). – jonrsharpe
Я не думаю, что 'twewhile' будет работать честно, поскольку он проходит линейно. Путь 'product' сортируется, я могу легко пропустить комбинации. Пожалуйста, поправьте меня, если я ошибаюсь. – Martol1ni
@ Martol1ni Поскольку данные уже отсортированы, [это] (http://ideone.com/dCMAF3) - лучшее, что вы можете получить, я думаю. – thefourtheye