Ich habe zwei Listen, x und y, und ich möchte x sortieren und y durch die Permutation der X-Sortierung permutieren. Zum Beispiel gegebenSchnellste Möglichkeit, mehrere Listen zu sortieren - Python
x = [4, 2, 1, 3]
y = [40, 200, 1, 30]
I
x_sorted = [1,2,3,4]
y_sorted = [1, 200, 30, 40]
diskutiert zu bekommen Wie in den vergangenen Fragen, eine einfache Möglichkeit, dies zu lösen, ist
x_sorted, y_sorted = zip(*sorted(zip(x,y)))
Hier meine Frage ist: Was ist der schnellste Weg, dies zu tun?
Ich habe drei Methoden, um die Aufgabe zu erledigen.
import numpy as np
x = np.random.random(1000)
y = np.random.random(1000)
Methode 1:
x_sorted, y_sorted = zip(*sorted(zip(x,y))) #1.08 ms
Methode 2:
foo = zip(x,y)
foo.sort()
zip(*foo) #1.05 ms
Methode 3;
ind = range(1000)
ind.sort(key=lambda i:x[i])
x_sorted = [x[i] for i in ind]
y_sorted = [y[i] for i in ind] #934us
Gibt es eine bessere Methode, die schneller als die oben genannten drei Methoden ausführt?
Zusätzliche Fragen.
- Warum Methode 2 ist nicht schneller als Methode 1, obwohl es Sortiermethode verwendet?
- Wenn ich Methode 2 getrennt ausführe, ist es schneller. In IPython Terminal
Ich habe
%timeit foo = zip(x,y) #1000 loops, best of 3: 220 us per loop
%timeit foo.sort() #10000 loops, best of 3: 78.9 us per loop
%timeit zip(*foo) #10000 loops, best of 3: 73.8 us per loop
Sie können 'itertools.izip' für inneres Reißverschluss machen Speicher effizient. –
@AshwiniChaudhary überprüft :) –
Verwenden Sie 'izip nicht außerhalb von sortierten, da es eine Iterator nicht Liste zurückgibt. –