【发布时间】:2022-01-16 12:49:06
【问题描述】:
我正在尝试优化一个计算函数:a*exp(b*x)+c
我使用 numpy 数组测试了三种方法:
def model(a,b,c,x):
return a*np.exp(b*x)+c
def myFoo1(modelParam,x):
return([model(*i,x) for i in modelParam])
def myFoo2(modelParam,x):
return([i[0]*np.exp(i[1]*x)+i[2] for i in modelParam])
def myFoo3(modelParam,x):
return(np.exp(np.outer(modelParam[:,1],x))*params[:,0][:,None]+params[:,2][:,None])
当测量运行时间时:
x=np.array(np.arange(0,100,0.1))
params=np.array([[10,0.1,2],[20,0.3,4],[30,0.2,6],[15,0.2,4],[16,0.5,7]])
%time myFoo1(params,x)
%time myFoo2(params,x)
%time myFoo3(params,x)
输出是:
CPU times: user 3.58 ms, sys: 0 ns, total: 3.58 ms
Wall time: 2 ms
CPU times: user 855 µs, sys: 0 ns, total: 855 µs
Wall time: 703 µs
CPU times: user 690 µs, sys: 0 ns, total: 690 µs
Wall time: 564 µs
第一个是我的原始代码,因为它最容易编程。但是,第三个要快 4 倍。我可以再改进一下吗?
并使用 %timeit(按照评论中的建议编辑问题):
211 µs ± 663 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
199 µs ± 199 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
164 µs ± 56.1 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
【问题讨论】:
-
能否请您展示一个
modelParam的小样本? -
@user17242583。它是 np.array
params。 a、b、c 参数有五个示例。 -
我的意思是,你能展示一下它的内容样本吗?如果我看到它是什么,那么试验它会更容易。或者也许只是它和它包含的数字范围?
-
@usrer17242588。我正在尝试优化对为许多 (a,b,c) 参数集返回 a.exp(b.x)+c 的函数的调用。在此示例中,x 输入始终是从 0 到 100 的相同范围。
-
好的,谢谢。请把
print(params.shape)的结果发过来好吗?
标签: python numpy optimization numpy-ndarray