Я пытаюсь выполнить серию больших 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).