Mathematica,提高循环中appendto的速度
Mathematica, improve speed for appendto in the loop
如何改进以下功能?目前它很慢。提前致谢。
discounts[firstDFF_] :=
Module[
{len = Length[swapdata], running = firstDF, newdisc, disclist = {firstDFF}, k = 2},
Do[
newdisc = (1 - swapdata[[k]]*running)/(1 + swapdata[[k]]);
running += newdisc;
AppendTo[disclist, newdisc]
,
{k, 1, len}
];
disclist
];
用于在引导过程中获取折扣因子列表。
代码从 14.59 秒加速到 0.34 秒,只需使用 disclist = {disclist, newdisc}
和 Flatten
而不是 AppendTo[disclist, newdisc]
。
演示如下。首先是OP的原始代码。
swapdata = ConstantArray[0.03, 100000];
firstDF = 1;
discounts[firstDFF_] := Module[{len = Length[swapdata],
running = firstDF,
newdisc,
disclist = {firstDFF}, k = 2},
Do[newdisc = (1 - swapdata[[k]]*running)/(1 + swapdata[[k]]);
running += newdisc;
AppendTo[disclist, newdisc], {k, 1, len}];
disclist];
First[{time, result1} = Timing[discounts[100]]]
14.594
discounts[firstDFF_] := Module[{
len = Length[swapdata],
running = firstDF,
newdisc,
disclist = {firstDFF}, k = 2},
Do[newdisc = (1 - swapdata[[k]]*running)/(1 + swapdata[[k]]);
running += newdisc;
disclist = {disclist, newdisc}, {k, 1, len}];
Flatten@disclist];
First[{time, result2} = Timing[discounts[100]]]
0.343
result1 == result2
True
更多方法。这些只是比 ChrisD 的 Do .. disclist = {disclist, newdisc} ..
稍微快一点
discounts[firstDFF_] :=
Module[{len = Length[swapdata], running = firstDF, newdisc},
Join[{firstDFF}, Table[
newdisc = (1 - swapdata[[k]]*(running))/(1 + swapdata[[k]]);
running += newdisc;
newdisc, {k, 1, len}]]];
First[{time, result} = Timing[discounts[100]]]
discounts[firstDFF_] := Module[{running = firstDF, newdisc},
Join[{firstDFF}, (
newdisc = (1 - #*running)/(1 + #);
running += newdisc;
newdisc) & /@ swapdata]];
First[{time, result} = Timing[discounts[100]]]
discounts[firstDFF_] :=
Reap[Sow[firstDFF];
Fold[#1 + Sow[(1 - Times@##)/(1 + #2)] &, firstDF ,
swapdata]][[2, 1]];
First[{time, result} = Timing[discounts[100]]]
如何改进以下功能?目前它很慢。提前致谢。
discounts[firstDFF_] :=
Module[
{len = Length[swapdata], running = firstDF, newdisc, disclist = {firstDFF}, k = 2},
Do[
newdisc = (1 - swapdata[[k]]*running)/(1 + swapdata[[k]]);
running += newdisc;
AppendTo[disclist, newdisc]
,
{k, 1, len}
];
disclist
];
用于在引导过程中获取折扣因子列表。
代码从 14.59 秒加速到 0.34 秒,只需使用 disclist = {disclist, newdisc}
和 Flatten
而不是 AppendTo[disclist, newdisc]
。
演示如下。首先是OP的原始代码。
swapdata = ConstantArray[0.03, 100000];
firstDF = 1;
discounts[firstDFF_] := Module[{len = Length[swapdata],
running = firstDF,
newdisc,
disclist = {firstDFF}, k = 2},
Do[newdisc = (1 - swapdata[[k]]*running)/(1 + swapdata[[k]]);
running += newdisc;
AppendTo[disclist, newdisc], {k, 1, len}];
disclist];
First[{time, result1} = Timing[discounts[100]]]
14.594
discounts[firstDFF_] := Module[{
len = Length[swapdata],
running = firstDF,
newdisc,
disclist = {firstDFF}, k = 2},
Do[newdisc = (1 - swapdata[[k]]*running)/(1 + swapdata[[k]]);
running += newdisc;
disclist = {disclist, newdisc}, {k, 1, len}];
Flatten@disclist];
First[{time, result2} = Timing[discounts[100]]]
0.343
result1 == result2
True
更多方法。这些只是比 ChrisD 的 Do .. disclist = {disclist, newdisc} ..
discounts[firstDFF_] :=
Module[{len = Length[swapdata], running = firstDF, newdisc},
Join[{firstDFF}, Table[
newdisc = (1 - swapdata[[k]]*(running))/(1 + swapdata[[k]]);
running += newdisc;
newdisc, {k, 1, len}]]];
First[{time, result} = Timing[discounts[100]]]
discounts[firstDFF_] := Module[{running = firstDF, newdisc},
Join[{firstDFF}, (
newdisc = (1 - #*running)/(1 + #);
running += newdisc;
newdisc) & /@ swapdata]];
First[{time, result} = Timing[discounts[100]]]
discounts[firstDFF_] :=
Reap[Sow[firstDFF];
Fold[#1 + Sow[(1 - Times@##)/(1 + #2)] &, firstDF ,
swapdata]][[2, 1]];
First[{time, result} = Timing[discounts[100]]]