当我听到人们说Mathematica不够快的时候,我通常会提出想要看一下这段令他们烦恼的代码,然后会发现,其实并不是Mathematica本身的表现不够好,而是Mathematica没有被最优使用。我觉得我应该和大家分享一下我在优化Mathematica代码时首先会看的一些内容。
01 如果可以的话尽量尽早使用浮点数
我最常看到的导致代码变慢的问题是,程序员会不经意地让Mathematica做超出需要的细致的事情。没必要的代数精确是其中最常见的问题。
在多数与数字相关的软件中,是不需要这么精确的代数的。1/3和0.33333333333333是一样的。当你碰到特别严重的在数字上不稳定的问题时这个差异可能会被放大的特别明显,但是,在大多数情况中,浮点数已经足够使用了,而且最重要的是,浮点数运算更快。Mathematica中,任何小于16位的小数都被看作是机器浮点数,所以如果更想要速度而可以舍弃一些精确性的时候,记得用小数(比如,三分之一输入为1./3.)。以下是一个例子,可以看到使用浮点数是精确数运行速度的50.6倍。在这个例子中,两个数字的使用得到的是同一个结果。
在符号运算中也是这样。如果你不是很在意符号式的结果,并且计算的稳定性也不是问题的话,那么尽快使用数值作为替代。比如,求解下面的二项式符号计算时,在使用数值作为替代之前,这个代码可能会让Mathematica生成长达五页的中间符号表达式。
但是如果先用数值替代,那么Solve会使用更快的数值方法。
当用数据列表工作时,使用实数的方法必须保持一致。只要一个精确的数值就可以让整个数据组处于一个更灵活但是缺乏效率的形式中。