在我们日常使用过程中,我们经常需要动态的修改一些列表,学过数据结构的话都知道,如果按顺序存储,那么当列表满了再往里面增加元素是需要再重新新建一个列表的,这个就会导致程序速度变慢,那么在Mathematica中有什么可以解决这个问题的方法呢,答案就是使用Reap,Sow。
其实之前我们也讲过关于Reap,Sow的一些用法,可以看下面这篇文章,Mathematica入门习题[4]–Reap与Sow的使用和字符串匹配,这一篇文章我们再详细说明一下Reap,Sow的一些用法。
关于详细的资料,可以在Mathematica的帮助文档中搜索:
tutorial/CollectingExpressionsDuringEvaluation
文章目录(Table of Contents)
Reap&Sow 基本用法
其实 Reap 和 Sow 是用来收集计算过程中的一些数字的,Reap 是用来收集计算过程中 Sow 的值的,我们可以看一下下面的这个例子:
- Reap[Sow[a = 3]; a += Sow[a^2 + 1]; Sow[a]; a = Sqrt[a + a^2]]
- >> {Sqrt[182], {{3, 10, 13}}}
计算过程中 Sow 了两次,Reap 就都能收集到,最后一个没有写 Sow 是因为 Reap 能计算那个表达式的值。
Reap&Sow 与 AppendTo 对比
之前说过使用Reap,Sow会比使用AppendTo速度要快,我们在这里做一个小的测试,获取 0-10^7 之间所有被 133 整除的数字,我们分别使用两种方法来实现。
Reap&Sow
- Timing[
- Reap[
- Do[(If[Mod[i, 133] == 0, Sow[i]]), {i, 1, 10^7}]
- ]
- ]
运行结果如下所示。这里一共花费了 8s 的时间,我们看一下 AppendTo 需要多久。
AppendTo
- Timing[
- t = {};
- Do[ (
- If[Mod[i, 133] == 0, AppendTo[t, i]]), {i, 1, 10^7}
- ];
- t
- ]
运行结果如下图。可以看到,使用 AppendTo 的话需要 40+s 的时间,比上面的方法是要慢很多的:
其实,除了上面的方法,我们还可以使用Select的方法
- Timing[Select[Range[1, 10^7], Mod[#, 133] == 0 &]]
可以看到时间也是 8s 多,也是挺不错的。
- 微信公众号
- 关注微信公众号
-
- QQ群
- 我们的QQ群号
-










![Mathematica进阶[9]-计算插值函数生成曲线的函数表达式](https://img.mathpretty.com/blog_article/2026/01/20260101_221141_ki57zvj.jpg)

评论