Для всех тех, кто задается вопросом об использовании теории обучения, этот вопрос является хорошей иллюстрацией. Правильный вопрос не о «быстром способе отскока между списками и кортежами в Python» - причина медлительности кроется в более глубоком.
То, что вы пытаетесь решить здесь, известно как проблема назначения : с учетом двух списков из n элементов каждый и n & times; n значений (значения каждой пары), как их назначить так, чтобы общее «значение» максимизируется (или, что эквивалентно, минимизируется). Для этого есть несколько алгоритмов, таких как Венгерский алгоритм ( Реализация Python ), или вы можете решить его, используя более общие алгоритмы потока с минимальными затратами, или даже привести его как линейный запрограммируйте и используйте LP-решатель. Большинство из них будут иметь время работы O (n 3 ).
То, что делает ваш алгоритм выше, состоит в том, чтобы попробовать все возможные способы их объединения (Запоминание помогает избежать повторного вычисления ответов для пар подмножеств, но вы по-прежнему просматриваете все пары подмножеств.) Этот подход составляет не менее Ω (n 2 2 2n ). Для n = 16 n 3 равно 4096, а n 2 2 2n равно 1099511627776. Конечно, в каждом алгоритме есть постоянные коэффициенты, но видите разницу? :-) (Подход в вопросе все же лучше, чем наивный O (n!), Что было бы намного хуже.) Используйте один из алгоритмов O (n ^ 3), и я предсказываю, что он должен работать вовремя до п = 10000 или около того, а не просто до п = 15.
«Преждевременная оптимизация - это корень всего зла», как сказал Кнут, но это также относится и к отложенной / просроченной оптимизации: сначала вы должны тщательно продумать подходящий алгоритм перед его реализацией, а не выбирать плохой, а затем задаться вопросом, какие его части медленные :-) Даже плохая реализация хорошего алгоритма в Python будет на несколько порядков быстрее, чем исправление всех «медленных»? части кода выше (например, переписав в C).