Почему numpy.dot намного быстрее, чем numpy.einsum?

У меня есть numpy, скомпилированный с OpenBlas, и мне интересно, почему einsum намного медленнее, чем точка (я понимаю в случае с 3 индексами, но я не понимаю, почему он также менее эффективен в случае с двумя индексами)? Вот пример:

import numpy as np
A = np.random.random([1000,1000])
B = np.random.random([1000,1000])

%timeit np.dot(A,B)

Out: 10 loops, best of 3: 26.3 ms per loop

%timeit np.einsum("ij,jk",A,B)

Out: 5 loops, best of 3: 477 ms per loop

Есть ли способ позволить einsum использовать OpenBlas и распараллеливание, например numpy.dot? Почему np.einsum не вызывает просто np.dot, если замечает скалярное произведение?


person varantir    schedule 27.05.2015    source источник
comment
Связанный: stackoverflow.com/questions/20149201/   -  person Alex Riley    schedule 27.05.2015
comment
Это правда, но мой вопрос скорее относился к случаю с двумя индексами. Ответы в данном посте создают впечатление, что есть проблемы с тремя индексами. Я был удивлен, что разница скоростей в этом конкретном примере настолько впечатляющая.   -  person varantir    schedule 27.05.2015
comment
Поскольку einsum написан как общий и не использует скалярное произведение двух индексов для использования blas. Это действительно суть. Если вы знаете, что у вас только два индекса, просто используйте точку.   -  person BeRecursive    schedule 27.05.2015


Ответы (1)


einsum анализирует строку индекса, а затем создает объект nditer и использует его для выполнения итерации по сумме продуктов. У него есть особые случаи, когда индексы просто выполняют перестановку осей и суммируют ('ii->i'). Он также может иметь особые случаи для 2 и 3 переменных (в отличие от большего количества). Но он не делает никаких попыток вызывать внешние библиотеки.

Я разработал чистый Python, похожий на работу, но с большим упором на синтаксический анализ, чем на специальные случаи вычислений.

tensordot изменяет форму и меняет местами, поэтому затем он может вызвать dot для фактических вычислений.

person hpaulj    schedule 27.05.2015