Mam dwie listy, x i y, i chcę posortować x i permutację y przez permutację sortowania x. Na przykład, biorąc pod uwagęNajszybszy sposób sortowania wielu list - Python
x = [4, 2, 1, 3]
y = [40, 200, 1, 30]
Chcę dostać
x_sorted = [1,2,3,4]
y_sorted = [1, 200, 30, 40]
Jak wspomniano w poprzednich pytaniach, w prosty sposób rozwiązać ten jest
x_sorted, y_sorted = zip(*sorted(zip(x,y)))
Oto moje pytanie: Co to jest NAJSZYBSZY sposób na zrobienie tego?
Mam trzy metody, aby wykonać zadanie.
import numpy as np
x = np.random.random(1000)
y = np.random.random(1000)
Metoda 1:
x_sorted, y_sorted = zip(*sorted(zip(x,y))) #1.08 ms
Metoda 2:
foo = zip(x,y)
foo.sort()
zip(*foo) #1.05 ms
metoda 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
Czy istnieje lepsza metoda, która wykonuje szybciej niż powyżej trzech metod?
Dodatkowe pytania.
- Dlaczego metoda 2 nie jest szybsza niż metoda 1, mimo że wykorzystuje metodę sortowania?
- Jeśli wykonam metodę 2 osobno, jest to szybciej. W terminalu ipython,
mam
%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
można użyć 'itertools.izip' na wewnętrznej zip, aby pamięć wydajny. –
@AshwiniChaudhary zaznaczone :) –
Nie używaj 'izip' poza posortowanym, ponieważ zwraca on nie listę iteratorów. –