f1[\[Tau]_] := Function[t, Exp[-2 Log[2] ((t - 2 \[Tau])/\[Tau])^2]]
f2 := Compile[{{\[Tau], _Real}, {t, _Real}},
Exp[-2 Log[2] ((t - 2 \[Tau])/\[Tau])^2]]
In[54]:= Do[f2[100., i], {i, 1., 100000., 1}] // AbsoluteTiming
Do[f1[100.][i], {i, 1., 100000., 1}] // AbsoluteTiming
Out[54]= {6.14074, Null}
Out[55]= {1.64779, Null}
问题1:为什么编译函数的话不能使用延迟定义,我试过了,不用延迟定义,计算速度会快,我的理解是因为如果用延迟定义,那么在每次计算的时候,都会去编译函数,所以计算速度会很慢。
f1[\[Tau]_] := Function[t, Exp[-2 Log[2] ((t - 2 \[Tau])/\[Tau])^2]]
f2 = Compile[{{\[Tau], _Real}, {t, _Real}},
Exp[-2 Log[2] ((t - 2 \[Tau])/\[Tau])^2]]
In[62]:= Do[f2[100., i], {i, 1., 100000., 1}] // AbsoluteTiming
Do[f1[100.][i], {i, 1., 100000., 1}] // AbsoluteTiming
Out[62]= {0.0964466, Null}
Out[63]= {1.59263, Null}
In[64]:= f2[100., 1000000.] // AbsoluteTiming
f1[100.][1000000.] // AbsoluteTiming
Out[64]= {0.0000199563, 0.}
Out[65]= {0.000075834, 7.221326*10^-60181920}
In[70]:= N /@ f2[100., 1000000.] // AbsoluteTiming
N /@ f1[100.][1000000.] // AbsoluteTiming
Out[70]= {0.0000228072, 0.}
Out[71]= {0.000066141, 7.221326*10^-60181920}
使用非延迟定义编译函数,运算速度提高了,但是在结果显示上面和function定义的稍微有点不同,虽然function定义的函数所得到的结果近似也是零,我该怎么调整,才能让编译函数得到和function定义函数所得到的结果相同