Вопрос по python-3.x, numpy, python, range – встроенный диапазон или numpy.arange: что эффективнее?

44

При переборе большого массива с выражением диапазона следует ли мне использовать встроенную в Python функцию диапазона или numpyarange чтобы получить лучшую производительность?

Мои рассуждения до сих пор:

arange вероятно, прибегает к нативной реализации и может быть быстрее. С другой стороны,arange возвращает полный массив, который занимает память, поэтому возможны издержки. Выражение диапазона Python 3 является генератором, который не содержит все значения в памяти.

arange вероятно прибегает к == & gt; Диапазон, вероятно, прибегает к. Кажется, это опечатка. Chan Kim

Ваш Ответ

2   ответа
9

Прежде всего, как написано @bmu,you should use combinations of vectorized calculations, ufuncs and indexing, Действительно, в некоторых случаях требуется явное зацикливание, но это действительно редко.

Если нужен явный цикл, с Python 2.6 и 2.7, вы должны использоватьxrange (увидеть ниже). Из того, что вы говорите, в Python 3,range такой же какxrange (возвращает генератор). Так что, может бытьrange это так же хорошо для вас.

Теперь вы должны попробовать это сами (используя timeit: - здесь ipython & quot; волшебная функция & quot;):

%timeit for i in range(1000000): pass
[out] 10 loops, best of 3: 63.6 ms per loop

%timeit for i in np.arange(1000000): pass
[out] 10 loops, best of 3: 158 ms per loop

%timeit for i in xrange(1000000): pass
[out] 10 loops, best of 3: 23.4 ms per loop

Опять же, как упомянуто выше, в большинстве случаев можно использовать формулу numy vector / array (или ufunc и т. Д.), Которая работает со скоростью c:much faster, Это то, что мы могли бы назвать «векторным программированием». Это делает программу легче для реализации, чем C (и более читабельной), но почти так же быстро, в конце концов.

Я полностью согласен, но вопрос был о "итерации по большому массиву". В некоторых ситуациях невозможно использовать векторизованный numy, ufunc или indexing. В примере, с которым я столкнулся, нужно вычислить собственные векторы списка матриц (& gt; = 3x3)
Спасибо, я не знал о волшебной функции. clstaudt
Я не знаю, еслиnp.arange был сделан более эффективным с 2012 года, но это основной интерес по сравнению со встроеннымrange является то, что вы можете использовать число с плавающей запятой в качестве начала: стоп: шаг.
Существует стандартный python 'timeit' модуль, который позволяет сделать то же самое без IPython. Но намного проще использовать эту магическую функцию.
-1 потому что я считаю, что это не очень хороший ориентир. зацикливание на массиве неэффективно.
52

Для больших массивов Numpy должен быть более быстрым решением.

В NumPy вы должны использовать комбинации векторизованных расчетов,ufuncs а такжеиндексирование чтобы решить ваши проблемы вC скорость. Зацикливание на массивах numpy неэффективно по сравнению с этим.

(Что-то вроде худшего, что вы могли бы сделать, это перебрать массив с индексом, созданным с помощьюrange или жеnp.arange как следует из первого предложения в вашем вопросе, но я не уверен, действительно ли вы это имеете в виду.)

import numpy as np
import sys

sys.version
# out: '2.7.3rc2 (default, Mar 22 2012, 04:35:15) \n[GCC 4.6.3]'
np.version.version
# out: '1.6.2'

size = int(1E6)

%timeit for x in range(size): x ** 2
# out: 10 loops, best of 3: 136 ms per loop

%timeit for x in xrange(size): x ** 2
# out: 10 loops, best of 3: 88.9 ms per loop

# avoid this
%timeit for x in np.arange(size): x ** 2
#out: 1 loops, best of 3: 1.16 s per loop

# use this
%timeit np.arange(size) ** 2
#out: 100 loops, best of 3: 19.5 ms per loop

Таким образом, для этого случая Numpy в 4 раза быстрее, чем при использованииxrange если вы делаете это правильно. В зависимости от вашей проблемы NumPy может быть намного быстрее, чем в 4 или 5 раз ускорить.

Ответы наэтот вопрос объясните некоторые дополнительные преимущества использования массивов numpy вместо списков python для больших наборов данных.

Похожие вопросы