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

时间:2018-11-21 20:55:19

标签: python performance numpy

我正在尝试执行一系列大的np.dot(a,x)操作,第一个操作似乎比随后的调用花费更长的时间。在我的问题中,a高[n x 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,对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)

所以numpy.core.multiarray.dot一直在花时间,它对堆栈中的任何内容都没有太多的了解。

我在Anaconda的Python 3.6上安装了mkl(Windows 7)。

0 个答案:

没有答案