网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
08月10日漏签0天
mathematica吧 关注:19,844贴子:73,924
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 25回复贴,共1页
<<返回mathematica吧
>0< 加载中...

别用For循环,它在Mathematica里又慢又不简洁,百害无一利!

  • 只看楼主
  • 收藏

  • 回复
  • xzcyr
  • 吧主
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
搜了一下,发现吧里好像没有主题帖专门说这个。(尽管我觉得这应该是任何一个有心学习Mathematica的人都能很容易地接触到的常识。)那就专开一帖好了。
为了便于修订,照例放到云笔记上:
note.youdao.com/noteshare?id=7334ad886b97de3565d59beea50b5350
……其实不看云笔记都无所谓,概括起来就那么几句话:
1. For循环写起来很冗长——这其实是其次的;
2. For循环在Mathematica里很慢——这其实也是其次的;
3. For循环的表意逻辑,几乎在任何情况下,都无意义地复杂。几乎所有涉及了For循环的语句,都可以使用具有Mathematica“范儿”的函数更加简洁、更加直接易懂地进行表达,再不济,也该用Do, While循环。
美好生活,从学会使用Table开始。


  • 国士无双-泰坦
  • 还未摆脱
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
顶顶


2025-08-10 08:54:23
广告
不感兴趣
开通SVIP免广告
  • 猫咪爱小果酱
  • 安装激活
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
MATLAB里面也有这样的趋向和告诫(特别是在几年前,for循环在作为脚本语言的MATLAB中比较慢),后来因为有JIT等加速和内部优化机制,使得for循环没那么不堪,从而这种呼声减弱。
但从程序美学以及范式上来说,无论是用MATLAB还是Mathematica语言,的确不推荐新手使用for循环。更严格地说,Mathematica本身作为函数式语言,for循环等语句本就不应该存在,为了完整性官方才加入的功能,而相应的功能应该使用函数式编程思维来实现,在这一点上,与MATLAB编程推崇数组式思维是一个道理。很多新手习惯C/C++的那套,上来就for循环起手,实际上效率低很多。


  • 就你叫瓜屁呀
  • 还没搞定
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我可能用的不多,发现老师同学确实没怎么用for循环,都是用的do循环,原来原因是这样的。


  • raodonghai
  • 大写小写
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
Do函数,仅仅执行不能判断。但是For就很好。比如一段循环,满足精度就停止。这时用Do,需要添加别的判断语句了


  • 啥都不懂999999
  • ()[]区别
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我学了 mathematica 也有几年了,也写过许多程序,但是仍是新手,一遇循环就想到 For,我也知道这是个坏习惯,但是很难改掉。


  • Alexander0620
  • 慢慢研究
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
Table, Array, Map, Apply, Fold, Nest ... 能高效代替 For 的太多了


  • 无影东瓜
  • 小吧主
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
今天在群里看到个例子,发现当循环终止条件比较复杂(比如上界会在循环中变化)时,For还是有一定优势的,例子如下
x = 10^6;
For[i = 1, i <= x, ++i, x -= 2] // AbsoluteTiming
x


2025-08-10 08:48:23
广告
不感兴趣
开通SVIP免广告
  • 龙化要元
  • 列表操作
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
吧主辛苦


  • 奥斯马登
  • 刚刚会用
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
Array[1 + #^2 &, 10^4]; // AbsoluteTiming
{0.00094395, Null}
Table[1 + i^2, 10^4]; // AbsoluteTiming
{0.00165795, Null}


  • Alexander0620
  • 慢慢研究
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
@无影冬瓜
尝试用 NestWhile,发现比 For 耗时超过一倍。我的主要结果是 Compile + NestWhile 可以完胜 For。
另外两点是:
1. Compile + For 比单独 For 竟然更糟,出乎意料。
2. Compile + NestWhile 额外添加一些编译选项,并没有进一步改善。


  • life略略略213
  • 安装激活
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
谢谢吧主


  • m001
  • 大写小写
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 25回复贴,共1页
<<返回mathematica吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示