Mathematica,提高循环中 appendto 的速度 [英] Mathematica, improve speed for appendto in the loop

查看:41
本文介绍了Mathematica,提高循环中 appendto 的速度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何改进以下功能?目前它很慢.提前致谢.

 折扣[firstDFF_] :=模块[{len = Length[swapdata], running = firstDF, newdisc, disclist = {firstDFF}, k = 2},做[newdisc = (1 - swapdata[[k]]*running)/(1 + swapdata[[k]]);运行 += 新光盘;AppendTo[disclist, newdisc],{k, 1, len}];唱片列表];

用于在引导期间获取折扣因子列表.

解决方案

只需使用 disclist = {disclist, newdisc}Flatten,代码就从 14.59 秒加速到 0.34 秒 而不是 AppendTo[disclist, newdisc].

演示如下.首先是OP的原始代码.

swapdata = ConstantArray[0.03, 100000];第一个DF = 1;折扣[firstDFF_] := 模块[{len = Length[swapdata],运行 = firstDF,新光盘,唱片列表 = {firstDFF},k = 2},Do[newdisc = (1 - swapdata[[k]]*running)/(1 + swapdata[[k]]);运行 += 新光盘;AppendTo[disclist, newdisc], {k, 1, len}];唱片];First[{time, result1} = Timing[discounts[100]]]

<块引用>

14.594

discounts[firstDFF_] := Module[{len = 长度[交换数据],运行 = firstDF,新光盘,唱片列表 = {firstDFF},k = 2},Do[newdisc = (1 - swapdata[[k]]*running)/(1 + swapdata[[k]]);运行 += 新光盘;disclist = {disclist, newdisc}, {k, 1, len}];扁平@disclist];First[{time, result2} = Timing[discounts[100]]]

<块引用>

0.343

result1 == result2

<块引用>

正确

how to improve the following function? currently it is very slow. Thanks in advance.

    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
        ];

it is for getting a list of discount factor during the bootstrapping.

解决方案

The code was sped up from 14.59 seconds to 0.34 seconds simply by using disclist = {disclist, newdisc} with Flatten instead of AppendTo[disclist, newdisc].

Demonstration below. First the OP's original code.

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

这篇关于Mathematica,提高循环中 appendto 的速度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆