Это мои тайминги на медленной машине
In [1034]: timeit [i for i in np.arange(10000000)]
1 loop, best of 3: 2.16 s per loop
Если я произвожу диапазон непосредственно (PY3 так это Genertor) раз намного лучше. Возьмите это базовое значение для понимания списка такого размера.
In [1035]: timeit [i for i in range(10000000)]
1 loop, best of 3: 1.26 s per loop
tolist
преобразует arange в список первым; занимает немного больше времени, но итерация по-прежнему в списке
In [1036]: timeit [i for i in np.arange(10000000).tolist()]
1 loop, best of 3: 1.6 s per loop
Использование list()
- то же самое время, как прямой итерации на массиве; что предполагает, что первая итерация сначала делает это.
In [1037]: timeit [i for i in list(np.arange(10000000))]
1 loop, best of 3: 2.18 s per loop
In [1038]: timeit np.arange(10000000).tolist()
1 loop, best of 3: 927 ms per loop
же раз в итерация на .tolist
In [1039]: timeit list(np.arange(10000000))
1 loop, best of 3: 1.55 s per loop
В общем, если вы должны цикл, работая в списке быстрее. Доступ к элементам списка проще.
Посмотрите на элементы, возвращаемые индексированием.
a[0]
- еще один numpy
объект; он строится из значений в a
, но не просто извлекаемое значение
list(a)[0]
- это тот же тип; список только [a[0], a[1], a[2]]]
In [1043]: a = np.arange(3)
In [1044]: type(a[0])
Out[1044]: numpy.int32
In [1045]: ll=list(a)
In [1046]: type(ll[0])
Out[1046]: numpy.int32
но tolist
преобразует массив в чистый список, в этом случае, как список Интс. Он работает больше, чем list()
, но делает это в скомпилированном коде.
In [1047]: ll=a.tolist()
In [1048]: type(ll[0])
Out[1048]: int
В общем не используйте list(anarray)
. Он редко делает что-то полезное и не так сильно, как tolist()
.
Какой самый быстрый способ перебора массива - Нет. По крайней мере, не в Python; в c-коде есть быстрые пути.
a.tolist()
- это самый быстрый и векторный способ создания целых чисел из массива. Он выполняет итерацию, но делает это в скомпилированном коде.
Но какова ваша реальная цель?
это * - * нечетный. Я пробовал это сам несколько раз, и кажется, что преобразование его в список делает его быстрее все время. Спасибо, что принесли это на свет. –
Просто повторите попытку и получите список или выполните некоторую обработку тоже? Использование только 'list (np.arange (1000000))' выглядит довольно быстро. – Divakar
@Divakar см. Http://stackoverflow.com/a/40575522/2336654 – piRSquared