Sum中的时间突出是怎么回事?
mathematica吧
全部回复
仅看楼主
level 7
真心不卡 楼主
Code:
Table[Sum[i,{i,10^o}]^2-Sum[i^2,{i,10^o}]; //AbsoluteTiming,{o,0,50}][[;;,1]]
Output:
{0.0000264831, 0.0000222458, 0.000120763, 0.000380298, 0.000731287, \
0.0063164, 1.18686, 0.000592869, 0.000395481, 0.000340749, \
0.000342162, 0.000651485, 0.000367939, 0.000655369, 0.000357699, \
0.000460806, 0.000349224, 0.000569917, 0.000426202, 0.000367939, \
0.000353461, 0.000349224, 0.000503179, 0.000358052, 0.000420199, \
0.000384182, 0.000354874, 0.000419493, 0.000352402, 0.000412077, \
0.000421611, 0.000358052, 0.00046469, 0.000354521, 0.000455156, \
0.000469281, 0.000352402, 0.000548024, 0.000355933, 0.000495058, \
0.000356992, 0.000444563, 0.000374295, 0.000356639, 0.000450919, \
0.000352755, 0.000357699, 0.000350283, 0.000501767, 0.000419846, \
0.000353461}
画了个图ListLogPlot[(上面Output), Joined -> True, Filling -> Bottom]
和编译有没有关系?
2018年11月02日 13点11分 1
level 7
真心不卡 楼主
又或者是变成机器精度了?
2018年11月02日 13点11分 2
level 7
真心不卡 楼主
Table[(Range[1,10^o]//Total)^2-(Range[1,10^o]^2//Total);//AbsoluteTiming,{o,0,7.8,0.4}][[;;,1]]
输出
{0.0000402543, 0.0000144774, 0.000016243, 0.0000155368, 0.000013065, \
0.0000151837, 0.0000886302, 0.0000420199, 0.0000451979, 0.0000907488, \
0.00124012, 0.00111618, 0.00296505, 0.00426378, 0.0123994, 0.0252607, \
0.062074, 1.73799, 4.35304, 11.5406}
2018年11月02日 13点11分 3
吧务
level 15
有意思。
首先,即使不做实验我们也基本可以肯定这和机器精度没关系,因为计算用的全是准确数。然后,实验发现,似乎只有在o=6的时候,Sum使用了“程序”式的求和,也就是,把1到10^6的数全生成出来,然后再加到一起,而其他时候,它似乎是先求通项再计算的:
Trace[Unevaluated[Sum[i, {i, 10^o}]^2 - Sum[i^2, {i, 10^o}]] /. o -> 5,
TraceInternal -> True]
(*输出非常短。可以看出来求和是直接算出来的,基本可以肯定用了通项公式。*)
Trace[Unevaluated[Sum[i, {i, 10^o}]^2 - Sum[i^2, {i, 10^o}]] /. o -> 6, (10^6 - 2)^2 //
Evaluate, TraceInternal -> True]
(*注意Evaluate不可省略。*)
(* {{{{HoldForm[999996000004]}}}} *)
不过,为什么会出现这种差别我就说不清楚了。可能是某种成本估计上的失误?
LZ不妨去Stackexchange进一步问问。
2018年11月03日 08点11分 4
同理我们基本可以确定这事和编译没关系。(Trace不到Compile的调用。)
2018年11月03日 08点11分
感谢吧主赐教
2018年11月03日 08点11分
1