У меня есть два списка, x и y, и я хочу сортировать x и переставлять y по перестановке x-сортировки. Например, приСамый быстрый способ сортировки нескольких списков - Python
x = [4, 2, 1, 3]
y = [40, 200, 1, 30]
Я хочу, чтобы получить
x_sorted = [1,2,3,4]
y_sorted = [1, 200, 30, 40]
Как обсуждалось в предыдущих вопросах, простой способ решить это
x_sorted, y_sorted = zip(*sorted(zip(x,y)))
Вот мой вопрос: Что такое Самый быстрый способ сделать это?
У меня есть три метода для выполнения задачи.
import numpy as np
x = np.random.random(1000)
y = np.random.random(1000)
Метод 1:
x_sorted, y_sorted = zip(*sorted(zip(x,y))) #1.08 ms
Метод 2:
foo = zip(x,y)
foo.sort()
zip(*foo) #1.05 ms
метод 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
Есть ли лучший способ, который выполняется быстрее, чем три метода?
Дополнительные вопросы.
- Почему метод 2 не быстрее, чем метод 1, хотя он использует метод сортировки?
- Если я выполняю метод 2 отдельно, он быстрее. В IPython терминале
У меня есть
%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
Вы можете использовать 'itertools.izip' для внутренней молнии, чтобы сделать его память эффективный. –
@AshwiniChaudhary checked :) –
Не используйте 'izip' вне сортировки, так как он возвращает итератор, а не список. –