intelligenteste Weg, um das verbinden zweier Listen in eine formatierte Zeichenkette
Können sagen, ich habe zwei Listen der gleichen Länge:
a = ['a1', 'a2', 'a3']
b = ['b1', 'b2', 'b3']
und ich möchte, um die folgende Zeichenfolge:
c = 'a1=b1, a2=b2, a3=b3'
Was ist der beste Weg, dies zu erreichen?
Habe ich folgende Implementierungen:
import timeit
a = [str(f) for f in range(500)]
b = [str(f) for f in range(500)]
def func1():
return ', '.join([aa+'='+bb for aa in a for bb in b if a.index(aa) == b.index(bb)])
def func2():
list = []
for i in range(len(a)):
list.append('%s=%s' % (a[i], b[i]))
return ', '.join(list)
t = timeit.Timer(setup='from __main__ import func1', stmt='func1()')
print 'func1 = ' + t.timeit(10)
t = timeit.Timer(setup='from __main__ import func2', stmt='func2()')
print 'func2 = ' + t.timeit(10)
und die Ausgabe ist:
func1 = 32.4704790115
func2 = 0.00529003143311
Haben Sie einige trade-off?
- +1 ich fand keinen Grund für die -1 (auch wörtlich).
- Hallo. Neue Lösung in meiner Antwort, siehe es bitte.
InformationsquelleAutor Jib | 2011-09-01
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
gibt
a1=b1, a2=b2, a3=b3
.
Dann:
Ergebnis
pat = ", ".join(n * ("%s=%%s",))
Dieser Implementierung ist, auf meinem system schneller als Ihre beiden Funktionen, und noch kompakter.
Dank @JBernardo für die vorgeschlagene Verbesserung.
In der neueren syntax
str.format
ist besser geeignet:Daraus ergibt sich weitgehend die gleiche Leistung, obwohl es akzeptieren kann jedes Objekt mit einem
__str__
- Methode, also zwei Listen von ganzen zahlen könnten immer noch hier arbeiten.Diese beiden Lösungen sehr verschiedene Dinge. Die ersten Schleifen in einer verschachtelte Weg, dann berechnet Indizes mit
list.index
, effektiv machen diese eine doppelt geschachtelte for-Schleife, und die, was Sie denken konnte, als 125,000,000 Operationen. Die zweite geht im Gleichschritt, Herstellung 500 Paare ohne tun 250000 Operationen. Kein Wunder, Sie sind so anders!Sind Sie vertraut mit Big O-notation für die Beschreibung der Komplexität von algorithmen? Wenn dem so ist, die erste Lösung ist kubische und die zweite Lösung ist lineare. Die Kosten der Wahl, die erste über die zweite wird wachsen mit einer alarmierenden rate als
a
undb
länger erhalten, so würde niemand verwenden einen Algorithmus, wie die.Persönlich würde ich fast sicher, verwenden Sie code wie
oder wenn ich nicht allzu besorgt über die Größe der
a
undb
und nur schnelle schreiben, würde ichzip
stattitertools.izip
. Dieser code hat verschiedene VorteileEr ist linear. Obwohl vorzeitige Optimierung ist ein riesige problem, es ist am besten nicht zu cavalierly verwenden einen Algorithmus mit einem unnötig schlechten asymptotische Leistung.
Es ist einfach und Redewendungen. Ich sehe andere Menschen, die den code schreiben, wie dies Häufig.
Es ist Speicher effizient. Durch die Verwendung einer generator expression statt einer Liste Verständnis (und
itertools.izip
eher alszip
), die ich nicht bauen unnötige Listen im Speicher, und drehen, was könnte ein O(n) (linear)-Speicher-operation in O(1) (konstant)-Speicher-Betrieb.Als für timing finden Sie die Schnellste Lösung, dies würde fast sicher sein, ein Beispiel für die vorzeitige Optimierung. Schreiben performante Programme, die wir verwenden, Theorie und Erfahrung zu schreiben, qualitativ hochwertige, beständige, gute code. Die Erfahrung zeigt, dass es bestenfalls nutzlos und schlimmstenfalls kontraproduktiv stop bei random-Operationen und stellen die Frage, "Was ist der beste Weg, das zu tun diese Besondere operation," und versuchen zu bestimmen, es von raten oder selbst testen.
In der Realität, die Programme mit der besten performance sind diejenigen, die geschrieben werden mit dem code der höchsten Qualität und sehr selektive Optimierungen. High-quality code, der die Werte der Lesbarkeit und Einfachheit über microbenchmarks endet als einfacher test, weniger buggy und schöner zu gestalten-diese Faktoren sind Schlüssel für effektiv optimieren Sie Ihr Programm. Die Zeit, die Sie verbringen die Festsetzung unnötigen bugs, das verstehen komplizierter code, und kämpfen mit re-factoring können ausgegeben werden, eine Optimierung statt.
Wenn es darum geht, Zeit zu optimieren, ein Programm-nachdem es getestet und wohl dokumentiert-das ist nicht random snippets, sondern auf diejenigen ermittelt, indem die tatsächlichen usecases und/oder performance-tests mit Messungen erfasst profiling. Wenn ein bestimmtes Stück code ist nur unter 0.1% der Zeit im Programm, kein Betrag der Beschleunigung das Stück Software wirklich gut.
itertools.izip(a,b)
wenn die Listen sind ziemlich lang, und Sie nicht möchten, erstellen Sie eine lange Liste im Speicher.