Если вы не используете многопоточность, то я рекомендую не использовать многопоточность, а также не думать с точки зрения использования многопоточности.
Причина в том, что чем проще и прямее вы можете решить проблему, тем легче думать.
В качестве второго совета, всякий раз, когда вы обнаруживаете, что перебираете перестановки, вам, вероятно, следует найти лучший подход. Причина в том, что число перестановок длины n
растет как n!
, и в зависимости от того, что вы делаете / вашего терпения, компьютеры достигают вершины где-то между n=10
и n=15
. Таким образом, поиск способов считать без фактической итерации становится необходимым. Как это сделать, конечно, зависит от вашей проблемы.
Но вернемся к проблеме, как указано. Я лично решил бы этот тип проблемы в Python, используя generators . То есть у вас есть код, который может генерировать следующий элемент списка в генераторе, а затем в другом месте вы можете иметь код, который его обрабатывает. Это позволяет сразу начать обработку списка и не хранить его в памяти.
На языке без генераторов я бы решил это с помощью замыканий. То есть вы передаете функцию (или объект), которую вы вызываете для каждого значения, которое делает все, что хочет. Это снова позволяет вам отделить логику итерации от логики того, что вы хотите делать с каждой итерацией.
Если вы работаете с другой формой совместной многозадачности, используйте ее вместо этого. Так, например, в JavaScript вы должны выяснить, как координировать действия с помощью Promises. (К счастью, синтаксис async / await позволяет вам сделать это и сделать его похожим на генераторный подход. Обратите внимание, что вы можете сразу получить большие части набора данных в памяти. Как избежать этого - тема сама по себе .) Для другого примера, в Go вы должны использовать каналы и программы.
Я бы обратился только к глобальным переменным в качестве крайней меры. И если вы это сделаете, помните, что вам нужно достаточно памяти, чтобы сохранить весь набор данных, который вы перебрали в памяти сразу. Это может быть много памяти!
Я предпочитаю все это обычному многопоточному подходу.