Порядок массива в `numpy.dot`

В Python числовая библиотека NumPy, как функция numpy.dot имеет дело с массивами различного порядка памяти? numpy.dot(c-order, f-order) против dot(f-order, c-order) и т.д.

Причина, по которой я спрашиваю, что давно (numpy 1.0.4?), я сделал несколько тестов и заметил, что numpy.dot выполняется хуже, чем вызов dgemm из scipy.linalg напрямую, с правильными флагами транспонирования, хотя оба вызывать одну и ту же библиотеку BLAS внутри. (Я подозревал, что причина заключалась в копировании входных матриц внутри numpy.dot, что трагично, если вход большой.)

Теперь я снова попробовал, и на самом деле numpy.dot выполняет то же самое, что и dgemm, поэтому нет причин держать массивы в определенном порядке и устанавливать флаги транспонирования вручную. Очень чистый код.

Итак, мой вопрос: как работает недавняя работа (пусть говорят 1.6.0) numpy.dot, гарантирует, когда все будет скопировано, а когда нет? Я беспокоюсь о 1) памяти 2) производительности здесь. Приветствия.

Ответы

Ответ 1

Возможно, что то, что вы видели, возможно, связано с ошибкой импорта точки с оптимизацией blas, которую поймают и обрабатывают без помех (этот фрагмент кода от numeric.py)

# try to import blas optimized dot if available
try:
    # importing this changes the dot function for basic 4 types
    # to blas-optimized versions.
    from _dotblas import dot, vdot, inner, alterdot, restoredot
except ImportError:
    # docstrings are in add_newdocs.py
    inner = multiarray.inner
    dot = multiarray.dot