Оптимальное (широковещательное) деление матрицы в numpy. Избегать временных массивов или нет?

Numpy позволяет добавлять / умножать / делить матрицы разных размеров при соблюдении определенных правил вещания . Кроме того, создание временных массивов является основным препятствием для скорости numpy.

Следующие результаты меня удивляют ... что происходит?

In [41]: def f_no_dot(mat,arr):
   ....:     return mat/arr

In [42]: def f_dot(mat,arr):
   ....:     denominator = scipy.dot(arr, scipy.ones((1,2)))
   ....:     return mat/denominator

In [43]: mat = scipy.rand(360000,2)

In [44]: arr = scipy.rand(360000,1)

In [45]: timeit temp = f_no_dot(mat,arr)
10 loops, best of 3: 44.7 ms per loop

In [46]: timeit temp = f_dot(mat,arr)
100 loops, best of 3: 10.1 ms per loop

Я думал, что f_dot будет медленнее, так как он должен был создать временный знаменатель массива, и я предположил, что этот шаг был пропущен f_no_dot. Я должен отметить, что это время линейно масштабируется (с размером массива до 1 миллиарда) для f_no_dot и немного хуже, чем linear для f_dot.

6
задан Ian Langmore 14 October 2011 в 17:21
поделиться