为什么在python会话中第一次调用np.dot时会慢得多?

为什么在python会话中第一次调用np.dot时会慢得多?,python,performance,numpy,Python,Performance,Numpy,我正在尝试执行一系列大的np.dot(a,x)操作,第一个操作似乎比后续调用花费的时间要长得多。在我的问题中,a是高的[nx2],而x是[2x1]。我的大矩阵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

我正在尝试执行一系列大的
np.dot(a,x)
操作,第一个操作似乎比后续调用花费的时间要长得多。在我的问题中,
a
是高的[nx2],而
x
是[2x1]。我的大矩阵
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\u profiler
,我得到了对
np.dot
的第一次调用的.155 s/call和对后续调用的.00013 s/call。是否有一些设置/错误检查
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)
ncalls tottime percall cumtime percall文件名:lineno(函数)
1 0.000 0.000 1.514 1.514{内置方法builtins.exec}
1    0.000    0.000    1.514    1.514 :1()
1 0.000 0.000 1.514 1.514速度_小。py:15(运行)
101 1.503 0.015 1.503 0.015{内置方法numpy.core.multiarray.dot}
1 0.000 0.000 1.491 1.491速度小。py:5(不工作)
100 0.000 0.000 0.012 0.000速度小。py:10(不工作)
因此,
numpy.core.multiarray.dot
占用了所有的时间,它不能提供更多关于堆栈底层的信息


我在Anaconda使用Python 3.6,并安装了mkl(Windows 7)。

我使用的是Python 3.6,但我猜您第一次会产生
import
开销。在这之后,模块被激活cached@roganjosh在脚本进入
之前,是否包含了模块(如果uuu name\uuuuu='\uuu main\uuuuu':
部分)?它是一个外部模块,代码中没有任何内容表明您正在使用它(编辑:这是一个谎言,您正在使用
@profile
装饰器,因此我将重新考虑)我不知道到底是什么时间绑定到主库时间。加载BLAS?