别用For循环,它在Mathematica里又慢又不简洁,百害无一利!
mathematica吧
全部回复
仅看楼主
吧务
level 15
xzcyr 楼主
搜了一下,发现吧里好像没有主题帖专门说这个。(尽管我觉得这应该是任何一个有心学习Mathematica的人都能很容易地接触到的常识。)那就专开一帖好了。
为了便于修订,照例放到云笔记上:
note.youdao.com/noteshare?id=7334ad886b97de3565d59beea50b5350
……其实不看云笔记都无所谓,概括起来就那么几句话:
1. For循环写起来很冗长——这其实是其次的;
2. For循环在Mathematica里很慢——这其实也是其次的;
3. For循环的表意逻辑,几乎在任何情况下,都无意义地复杂。几乎所有涉及了For循环的语句,都可以使用具有Mathematica“范儿”的函数更加简洁、更加直接
易懂地进行表达,再不济,也该用Do, While循环。
美好生活,从学会使用Table开始。
2017年05月06日 15点05分 1
level 8
[滑稽]顶顶
2017年05月06日 16点05分 3
level 1
MATLAB里面也有这样的趋向和告诫(特别是在几年前,for循环在作为脚本语言的MATLAB中比较慢),后来因为有JIT等加速和内部优化机制,使得for循环没那么不堪,从而这种呼声减弱。
但从程序美学以及范式上来说,无论是用MATLAB还是Mathematica语言,的确不推荐新手使用for循环。更严格地说,Mathematica本身作为函数式语言,for循环等语句本就不应该存在,为了完整性官方才加入的功能,而相应的功能应该使用函数式编程思维来实现,在这一点上,与MATLAB编程推崇数组式思维是一个道理。很多新手习惯C/C++的那套,上来就for循环起手,实际上效率低很多。
2017年05月08日 11点05分 4
入门难就难在改变思维习惯,MMA强大之处也正在其独特的编程Style(MMA范儿,具体指的是规则模式等表达以及函数式思想),这与其他很多语言差别非常大,表示目前还在学习的路上。
2017年05月08日 11点05分
回复
失落的记忆sea
:[大拇指]
2017年05月18日 06点05分
[真棒]
2017年06月04日 07点06分
多说一句,Maltab的for函数,其实更类似MMA中的Do函数
2025年04月11日 08点04分
level 2
我可能用的不多,发现老师同学确实没怎么用for循环,都是用的do循环,原来原因是这样的。
2017年05月09日 04点05分 5
level 3
Do函数,仅仅执行不能判断。但是For就很好。比如一段循环,满足精度就停止。这时用Do,需要添加别的判断语句了
2017年05月10日 03点05分 6
While
2017年05月18日 06点05分
NestWhile配合Fold
2017年11月18日 02点11分
level 5
我学了 mathematica 也有几年了,也写过许多程序,但是仍是新手,一遇循环就想到 For,我也知道这是个坏习惯,但是很难改掉。
2017年05月17日 22点05分 7
level 12
Table, Array, Map, Apply, Fold, Nest ... 能高效代替 For 的太多了
2017年05月18日 06点05分 8
吧务
level 12
今天在群里看到个例子,发现当循环终止条件比较复杂(比如上界会在循环中变化)时,For还是有一定优势的,例子如下
x = 10^6;
For[i = 1, i <= x, ++i, x -= 2] // AbsoluteTiming
x
2017年05月18日 07点05分 9
但是这个例子刻意构造的味道很浓。在什么样的实际场景下会需要这样的算法?此外,尽管在这种情况下For略快于While,但其表意却比While要含糊。
2017年06月03日 14点06分
level 9
吧主辛苦[大拇指]
2017年06月03日 14点06分 12
level 10
Array[1 + #^2 &, 10^4]; // AbsoluteTiming
{0.00094395, Null}
Table[1 + i^2, 10^4]; // AbsoluteTiming
{0.00165795, Null}
2017年06月04日 02点06分 13
level 12
@无影冬瓜
尝试用 NestWhile,发现比 For 耗时超过一倍。我的主要结果是 Compile + NestWhile 可以完胜 For。
另外两点是:
1. Compile + For 比单独 For 竟然更糟,出乎意料。
2. Compile + NestWhile 额外添加一些编译选项,并没有进一步改善。
2017年11月18日 12点11分 16
但是,我怀疑是在编译过程中它就“偷偷计算”了[滑稽]
2017年11月18日 15点11分
@Alexander0620 ……你这Compile的用法根本就不对。去把吧里那篇编译的教程读了。
2017年12月02日 09点12分
@xzcyr naive compilation
2017年12月02日 10点12分
@Alexander0620 还有这帖6楼也稍微谈及了一些:https://tieba.baidu.com/p/3734408226
2017年12月02日 10点12分
level 1
谢谢吧主
2019年07月20日 12点07分 29
level 3
[大拇指]
2020年03月21日 07点03分 34
1