本帖最后由 dannie 于 2023-7-6 15:11 编辑
自从我开始在 Wolfram 工作,我几乎一直在使用 Mathematica,不仅作为计算软件,而且作为编写文档的程序。我很快就在这两种功能中熟练使用 Mathematica,但我还没有真正将它用作Wolfram 语言的编程平台。
我在高中时发现了 Wolfram,我当时——现在仍然如此!——对 Wolfram|Alpha 的自然语言能力和知识库着迷。这种兴趣一直持续到大学,在大学我接受了 Python 和 Java 的经典培训,但继续将 Wolfram|Alpha 用于数学和化学。我的本科研究要求我学习 bash 脚本和 Tcl,期间我继续使用 Python。
在我攻读博士学位的第一学期,我在研究生院的高级量子力学课程中接触了 Mathematica。我的博士研究小组的研究科学家是一个强大的 Mathematica 用户,建议我用他的 Mathematica 笔记本仔细检查最初使用 Python 分析的结果。尽管我在攻读博士学位期间多次接触 Mathematica,但我从未想过 Wolfram 语言可以与 Python 相媲美,直到我开始在 Wolfram 工作时才意识到它可以用于“实际”编程。
所以一个星期六,我坐在我的电脑前,通过重写我本科计算机导论课程的作业来弄清楚 Wolfram 语言的功能。我可以在 Wolfram 语言中快速镜像我的本科 Python 代码,但最终学到了两条非常重要的经验:
作为一名本科生,我使用 Python 的第一个项目是编写蒙特卡罗模拟,该模拟基于一组先前的示例回报来估计简单的投资回报。 在这个任务中,我们必须: 用 Python 编写蒙特卡罗模拟 将代码的输出导入 R 在 R 中分析我们的模拟 写一篇关于我们的模拟和结果的讨论
当用 Wolfram 语言重做这个项目时,我决定将 Python 配置为我的 Mathematica 包运行。所以我按照这些说明在 Mathematica 中配置 Python。这个过程让我可以使用我的代码并评估它的可比速度。
现在,让我带您完成这项任务。第一步是为 2004 年和 2014 年之间的投资回报率列表分配一个变量。这个任务对两种编程语言都很简单,但在 Wolfram 语言中,我们可以直接从 Wolfram 知识库中提取实际的投资回报数据:
任务的下一步是创建您自己的函数来计算平均值和标准差,并从由该平均值和标准差定义的正态分布中采样一个随机值。在用 Wolfram 语言编写这些自创函数时,我发现了四个最佳实践:
与 Python 中的 # 或""相比,Wolfram 语言中的注释是使用(* *)创建的。您还可以突出显示一段代码输入并使用快捷键 Alt + / (或 macOS 上的 Command + / )进行注释。 For 循环和 While 循环不是 Wolfram 语言中循环的最佳方法。相反,使用Table、Map或其他 Wolfram 函数来加速您的代码。 不要将您自己创建的 Wolfram 语言函数的首字母大写,因为 Wolfram 定义的函数都是使用驼峰命名的。此外,切勿在函数名称中使用_ ,因为这表示 Wolfram 语言中的模式序列。 在 Wolfram 语言中定义多个函数时,使用一系列不同的迭代变量(即i 、j 、k 、l等)或使用Module函数。这样,如果您调用多个自创函数,迭代变量就不会无意中混淆。
这是我本科时用 Python 编写的一些示例代码:
这是我最近写的可比较的 Wolfram 语言版本:
任务的下一步是编写蒙特卡罗模拟。(完整的代码示例可在我的示例 Monte Carlo 模拟项目附录中找到。)当我第一次用 Wolfram 语言起草这个程序时,我基本上逐字重写了我的 Python 代码、For 循环等。因此,当我运行蒙特卡罗模拟时(高级 Wolfram 语言用户会理解),即使模拟只有 1000 个点,花费的时间也明显比我预期的要长。
正是在这一点上,我意识到 Wolfram 语言与其他口语和手语类似,具有多种构造句子的方法,并且它需要不同的结构来编程。当您有另一种计算语言的背景时,不要认为这种语言与您知道并习惯使用的另一种编程语言的工作方式相似,这一点很重要。
当我重写 Wolfram 语言代码使其不是我的迭代 Python 代码风格的逐字副本时,我的蒙特卡罗模拟在速度上与我的原始 Python 代码示例相当。
任务的最后一步在 Wolfram 语言中很容易:创建直方图并从我的蒙特卡罗模拟输出中获取均值、标准差以及上下 5% 分位数。(对于我的本科作业,所有这些任务都是在 R 和 Python 中执行的,因为在 Python 中创建数字和执行统计对于入门计算课程来说太困难和复杂了。)
在单个软件中对每一个 Wolfram 语言函数进行编程并分析数据非常方便强大。我还花时间简要地重写了关于我的结果的“讨论”。教过多门课——并为大量的作业评分!——作为整个研究生院的助教,我对老师们在评分和审查学生作业时所做的所有工作更加感激。我记得有很多学生在这门本科计算机科学课程中忘记提交他们项目的讨论部分,因为它是独立于 Python 和 R 代码的文档。
Mathematica 在 notebook 界面中集成了代码和排版,可以帮助防止诸如讨论部分未附加到项目代码中的问题。此外,Mathematica 现在支持的一个重要功能是 Mathematica Online的集成,它使用 Wolfram Cloud。许多大学和学院现在都支持 Mathematica 和 Mathematica Online。这让您和其他人可以通过 Web 浏览器、手机或平板电脑访问它,还可以更轻松地共享和发布文档。我可以很容易地看到这个作业的新版本:
“使用以下命名约定:Comp_Sci_100_StudentLastName_Proj1.” 将您完成的 Mathematica 笔记本(代码、结果和讨论)分享到*在此处插入教师电子邮件*” 当学生与他们共享笔记本时,教授的 Wolfram Cloud 将发送通知。教职员工可以将笔记本分类到适当的文件夹中,并在准备为作业评分时打开它。
我进行了多个测试来比较 Wolfram 语言和 Python 中不同编程风格的效果来创建这个博客,并将计算分成两个表。所有这些计算都是在 Mathematica 中执行的,Python 计算是在 Mathematica 中使用 Python 的外部会话执行的。
第一列显示了我所描述的迭代编程风格的缓慢时间。(这种风格也称为过程式编程。)第二列介绍了用户定义的函数式编程。这是我使用 Table 或 Map 作为循环函数而不是 For 循环的时候,并遵循了前面提到的 Wolfram 语言中的四个最佳实践。我仅使用内置函数(而不是自创函数)为实现此蒙特卡罗模拟进行了最后一次速度测试。在我的附录中,我还包含了两种额外的 Python 编程风格的代码,这两种编程风格的时序都与这种内置函数风格相似:
表1:以毫秒为单位的 Wolfram 计时
表 2:以毫秒为单位的 Python 计时
(一些注意事项:所有计算均在 Mathematica 中执行。三次重复值的平均值显示在相应表格的每个框中。Python 计算是使用 Mathematica 中的外部会话执行的。浅蓝色背景用于表示最快的时间. 计时使用 Wolfram 的 AbsoluteTiming函数计算,类似的方法用于 timeit 函数和 Python 3.9 版。)
如上表所示,迭代式编程是最慢的。比较单一语言中的不同编程风格,Wolfram 语言在速度上有更大的差异。尽管这种时间差异在 Python 语言中很明显,但并没有那么显著。对于新程序员来说,用 Wolfram 语言编程时这种最初的缓慢速度可能是一种威慑。然而,正如所有程序员都学会以更高效和有效的方式编写代码一样,与编程风格相关的速度的显著提高在 Wolfram 语言中更为明显。从这些表中,很明显 Wolfram 语言在速度上可与 Python 等其他解释型语言相媲美。
对于我们这些接受过 Python 和其他计算语言经典训练的人来说,如果我们尝试像其他语言一样构建代码,Wolfram 语言可能看起来很慢。然而,如果我们退后一步重新考虑我们的代码和我们正在使用的函数,Wolfram语言具有相当的速度和可供探索的大量功能。这些功能还可以使静态作业本质上是动态的,让学生能够使用真实世界的数字和数据探索概念。学习 Wolfram 语言就像学习任何外语一样:必须始终考虑语法和措辞。
购买软件/免费试用 【13.2.1中英文 Wolfram 软件】请评论留言申请
|