Почему np.dot намного медленнее при первом вызове в сеансе Python? - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь выполнить серию больших np.dot(a,x) операций, и первая, кажется, занимает намного больше времени, чем последующие вызовы.В моей задаче a имеет высокий [nx 2], а x - [2 x 1].Моя большая матрица a постоянна, просто меняется x.Вот MWE:

import numpy as np

@profile
def do_work(a,x):
    tmp = np.dot(a,x)
    return tmp

@profile
def do_work_iter(a,x):
    tmp = np.dot(a,x)
    return tmp

if __name__=="__main__":

    n = 50000
    a = np.random.randn(n,2)
    x = np.random.randn(2,1)

    #
    tmp = do_work(a,x)

    #
    niter = 100
    for i in range(niter):
        x = np.random.randn(2,1)
        tmp = do_work_iter(a,x)

Используя line_profiler, я получаю .155 с / вызов для первого вызова на np.dot и .00013 с / вызов для последующих.Есть ли какая-то настройка / проверка ошибок, которую numpy выполняет здесь в первый раз?Есть ли способ, которым я могу обойти это?Или есть какой-то поиск функций blas, который занимает все время?

Я также запустил profile, и это дает следующее:

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
     1    0.000    0.000    1.514    1.514 {built-in method builtins.exec}
     1    0.000    0.000    1.514    1.514 <string>:1(<module>)
     1    0.000    0.000    1.514    1.514 speed_small.py:15(run)
   101    1.503    0.015    1.503    0.015 {built-in method numpy.core.multiarray.dot}
     1    0.000    0.000    1.491    1.491 speed_small.py:5(do_work)
   100    0.000    0.000    0.012    0.000 speed_small.py:10(do_work_iter)

, поэтому numpy.core.multiarray.dotзанимая все время, это не дает особого представления о чем-либо еще ниже в стеке.

Я нахожусь на Python 3.6 от Anaconda и у меня установлен mkl (Windows 7).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...