Виникло те саме питання та цікаво ставилося до виконання кожного рішення.
Ось %timeit
:
import numpy as np
lst = [['a','b','c'], [1,2,3], ['x','y','z']]
Перший нульовий шлях, що перетворює масив:
%timeit list(np.array(lst).T[0])
4.9 µs ± 163 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
Цілком рідний, використовуючи розуміння списку (як пояснив @alecxe):
%timeit [item[0] for item in lst]
379 ns ± 23.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
Ще один власний спосіб використання zip
(як пояснив @dawg):
%timeit list(zip(*lst))[0]
585 ns ± 7.26 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
Другий нудотний шлях. Також пояснив @dawg:
%timeit list(np.array(lst)[:,0])
4.95 µs ± 179 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
Дивно (ну, принаймні, для мене) рідний спосіб, який використовує розуміння списку, є найшвидшим і приблизно в 10 разів швидшим, ніж нумерований. Запуск двох нумерованих шляхів без остаточного list
економить приблизно один мкс, що все ще знаходиться в 10-кратній різниці.
Зауважте, що коли я оточував кожний фрагмент коду із закликом до len
, щоб гарантувати, що Генератори працюватимуть до кінця, терміни залишилися колишніми.