zoukankan      html  css  js  c++  java
  • [翻译]关于Mathematica提速的几点技巧(二)

    4.(这一部分涉及Workbench,故不译)

     

    5. 记住将来要用到的数据

    这一点对于任何语言都是有益的,在Mathematica的体系中你应该记住下面的结构:

     f[x_] := f[x] =(*What the function does*)

    这会记住任何f在特定参数下的返回值,所以被重复调用是不用再次计算.这是用内存交换时间的做法,所以如果计算量非常大的话这种做法是不合适的.但是对于小规模的程序,这是非常有用的.让我们用这个方法来拯救我在第三点举的那个蛋疼程序:把第一条规则修改一下:

     fib[n_] := fib[n] = fib[n - 1] + fib[n - 2];

    现在,求解fib[35]只需要计算主规则33次,所以速度快得令人难以置信.要点是:调用以前的结果避免了重复的递归.

     

    6.并行计算

    越来越多的Mathematica操作(线性代数,图像处理,统计分析)会自动地进行并行计算,Compile也能通过人工设定并行处理.对于其他类型的操作和远程并行,你可以使用内置的并行编程架构.

     有一系列的工具可用于并行操作,但是对于独立的任务,仅仅使用ParallelTable,ParallelMap和ParallelTry就可以达到很好的效果.它们中的每一个都能自动调度计算过程中的通信,任务管理,和结果收集工作.这些调度工作会消耗一点时间,但这是值得的.

     你的Mathematica拥有4个计算核心,如果你有更多的CPU资源,还可以借助girdMathematica扩展并行能力.下面的例子中ParallelTable就让我获得了双倍的性能,因为我的机器是双核的.更多的核可以带来更佳的性能.

     Table[PrimeQ[x], {x, 10^1000, 10^1000 + 5000}]; // AbsoluteTiming

     {8.8298264, Null}

    ParallelTable[PrimeQ[x], {x, 10^1000, 10^1000 + 5000}]; // AbsoluteTiming

     {4.9921280, Null}
    在Mathematica中,万事皆能并行.你可以发送并行任务到远程硬件上以C代码形式或者在GPU上运行.

     

    7.SowReap累积大规模数据.

    Mathematica 的数据结构很灵活,所以AppendTo不会假定你要追加的数而不是文件,声音或图像.这样导致的结果是,AppendTo每次都会把原数据复制下来,调整结构以容纳新追加的数据.随着数据量的增加运行会越来越慢.(Append的效果也是类似的).

    我们使用SowReap. Sow抛出你要累积的值,Reap收集它们并在最后生成数据.下面的两段代码是等价的,后者速度却快了很多.

    data = {}; Do[AppendTo[data, RandomReal[x]], {x, 0, 40000}]; // AbsoluteTiming

    {5.8813508, Null}

    data = Reap[Do[Sow[RandomReal[x]], {x, 0, 40000}]][[2]]; // AbsoluteTiming

    {0.1092028, Null}

     
     
    (待续)
  • 相关阅读:
    [转]只有程序员才能看懂的幽默
    论安防集成管理平台规范标准建设的重要性和必要性
    视频集成技术演进与创新实践
    (转)jQuery中Ajax事件beforesend及各参数含义
    (转)如何打一手好Log
    marquee标签
    如何学习Git,如何使用Git
    学习vue
    python安装教程
    Jmeter压力测试(入门篇)
  • 原文地址:https://www.cnblogs.com/mymma/p/2660887.html
Copyright © 2011-2022 走看看