Ничто не «более эффективно», без контекста.
Вложенные циклы будут работать в любом списке городов, какими бы большими они ни были, при условии, что вам удалось его построить в первую очередь. Он имеет дополнительные накладные расходы на запуск внешнего цикла, который повторно повторно инициализирует внутренний цикл.
Второе исключает это, но ему необходимо построить вторую копию всех данных ''.join(cities)
для повторения итерации. Если ваш список городов достаточно велик или ваша среда достаточно короткая в памяти, это не удастся, если первая из них будет успешной. Кроме того, он генерирует больше мусора, который потребует рекультивации.
Почти наверняка либо вы получите работу достаточно быстро, если только вы не разрабатываете встраиваемую в гороховую систему встроенную систему с очень ограниченной оперативной памятью. В целом на современных ПК-системах с ГГц-процессорами и Гбайтами ОЗУ эффективность не должна быть вашим первым рассмотрением. Исключением является то, что вы можете предсказать, что объем данных, необходимых для сборки в ОЗУ, может превысить объем доступной ОЗУ, и в этом случае стоит избегать полных промежуточных копий. Другое - там, где у вас есть алгоритмы разного порядка и не может абсолютно гарантировать, что количество данных всегда останется небольшим. В этом случае предпочитайте алгоритм более низкого порядка. O (N) превосходит O (N^2) в огромной степени, когда N становится большим!