Weder ist "effizienter", ohne Kontext.
Die verschachtelten Schleifen funktionieren auf jeder Liste von Städten, egal wie groß sie sind, vorausgesetzt, Sie haben es geschafft, sie zu erstellen. Es hat den zusätzlichen Aufwand, eine äußere Schleife auszuführen, die die innere Schleife wiederholt initialisiert.
Die zweite vermeidet das, aber muss eine zweite Kopie aller Daten ''.join(cities)
erstellen, um durchzulaufen. Wenn Ihre Liste von Städten groß genug oder Ihre Umgebung kurz genug im Speicher ist, wird es fehlschlagen, wo der erste Erfolg haben würde. Außerdem erzeugt es mehr Müll, der wiederhergestellt werden muss.
Mit ziemlicher Sicherheit werden beide die Arbeit schnell genug erledigen, es sei denn, Sie entwickeln für ein emanzipiertes Embedded-System mit sehr begrenztem RAM. Im Allgemeinen sollte bei modernen PC-Systemen mit GHz-CPUs und Gbytes RAM die Effizienz nicht die erste Überlegung sein. Eine Ausnahme besteht darin, dass Sie vorhersagen können, dass die Menge an Daten, die Sie im RAM zusammenstellen müssen, die verfügbare RAM-Menge übersteigt. In diesem Fall lohnt es sich, vollständige Zwischenkopien zu vermeiden. Die andere ist, wo Sie Algorithmen unterschiedlicher Reihenfolge haben und nicht absolut garantieren können, dass die Menge der Daten immer klein bleiben wird. In diesem Fall bevorzugen Sie einen Algorithmus niedrigerer Ordnung. O (N) übertrumpft O (N^2) in einem großen Ausmaß, wenn N groß wird!