我正在尝试执行一系列大的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)。