2013-05-23 3 views
1

Если у меня есть большой Numpy массив x я могу ускорить многие итеративные операции, как вместо того, чтобы писатьСделать итерации массив быстрее с помощью представлений

x[1:-1] = 5*x[1:-1] 

я могу использовать

x[1:-1] *= 5 

который быстрее, потому что в отличие от первого примера, это позволяет избежать ненужного создания дополнительного массива со значениями 5*x[1:-1].

вот мой вопрос: Можно ли ускорить более общую итерацию, как

x[1:-1] = 5*x[1:-1] + x[:-2] 

подобным образом? До сих пор я только придумал

x[1:-1] = x[:-2] 
x[1:-1] += 5*x[2:] 

но это все еще создает копии, и мне интересно, есть ли способ стать быстрее.

+0

Вы можете сделать это одним движением, на месте –

ответ

1

Иногда вам просто нужны временные arryas, и вы не можете переписать

x[1:-1] += 5*x[2:] 

как операции на вид.

Аналоговые вычисления на месте, когда вам нужны временные массивы, является создание нескольких временных массивов и использование их для вывода на каждом этапе вычисления. У вас все еще есть немного больше математики указателей, но вам не придется создавать пространство в памяти более одного раза. Затем вы можете переписать строку выше:

np.multiply(x[2:], 5, out=temp) 
x[1:-1] += temp 

Здесь, я полагаю, temp имеет размер x[-1:1] что то, что я обычно делаю для этого общего вопроса борьбы с границами.

С вычислениями в месте вы не можете запустить точное уравнение с timeit много раз, потому что числа растут в геометрической прогрессии, но вот тест с 5x заменен 1x:

import numpy as np 
from timeit import timeit 

N = 100000000 
x = np.arange(N, dtype=np.int) 
temp = np.zeros((N-2,), dtype=np.int) 

def f0(x, temp): 
    x[1:-1] += 1*x[2:] 

def f1(x, temp): 
    np.multiply(x[1:-1], 1, out=temp) 
    x[1:-1] += temp 

print timeit("f0(x, temp)", "from __main__ import f0, f1, x, temp", number=100) 
print timeit("f1(x, temp)", "from __main__ import f0, f1, x, temp", number=100) 

, который дает:

71.543628931 
44.719383955 

# or, for N /= 100, and number *= 10 
5.37844896317 
4.50015997887 

и для гораздо меньших массивов подход массива out может замедляться.

Смежные вопросы