Индексирование массива 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-кратное ускорение. Конечно, это глупый пример, но я думал, что это образовательный.

Ответы на вопрос(2)

Ваш ответ на вопрос