Индексирование массива Numpy и / или добавление кажется медленным
Я играл с эталонными массивами numpy, потому что получал медленнее, чем ожидалось, когда пытался заменить массивы python на numpy массивы в скрипте.
Я знаю, что что-то упустил, и я надеялся, что кто-то сможет прояснить мое невежество.
Я создал две функции и рассчитал их
NUM_ITERATIONS = 1000
def np_array_addition():
np_array = np.array([1, 2])
for x in xrange(NUM_ITERATIONS):
np_array[0] += x
np_array[1] += x
def py_array_addition():
py_array = [1, 2]
for x in xrange(NUM_ITERATIONS):
py_array[0] += x
py_array[1] += x
Результаты:
np_array_addition: 2.556 seconds
py_array_addition: 0.204 seconds
Что дает? Что вызывает массовое замедление? Я подумал, что если бы я использовал массивы статического размера, numpy был бы по крайней мере с той же скоростью.
Спасибо!
Обновить:Меня все время беспокоило то, что доступ к массивам был медленным, и я подумал: «Эй, это просто массивы в памяти, верно? Cython должен решить эту проблему!»
И это сделал. Вот мой пересмотренный тест
import numpy as np
cimport numpy as np
ctypedef np.int_t DTYPE_t
NUM_ITERATIONS = 200000
def np_array_assignment():
cdef np.ndarray[DTYPE_t, ndim=1] np_array = np.array([1, 2])
for x in xrange(NUM_ITERATIONS):
np_array[0] += 1
np_array[1] += 1
def py_array_assignment():
py_array = [1, 2]
for x in xrange(NUM_ITERATIONS):
py_array[0] += 1
py_array[1] += 1
Я переопределилnp_array
вcdef np.ndarray[DTYPE_t, ndim=1]
print(timeit(py_array_assignment, number=3))
# 0.03459
print(timeit(np_array_assignment, number=3))
# 0.00755
Это с помощью функции python, также оптимизируемой с помощью Cython. Время для функции Python в чистом Python
print(timeit(py_array_assignment, number=3))
# 0.12510
17-кратное ускорение. Конечно, это глупый пример, но я думал, что это образовательный.