我用 Python 不多,主要是教学里面用。日常主要用 Mathematica。尝试比较一下。
-使用方便。我曾经尝试过用 Python (Sage)代替 Mathematica,但是很快就放弃了。因为搞科研一般是碰到一个方程,不知道怎么解,打开个软件打进去,然后出结果,拷贝一下结果到下一行输入,删掉几项,再画个图之类。要是用 Python 的话,先要一大堆 import,输出不够直观(如果用普通输出),拷贝到输入也有各种限制(如果用 LaTeX 排版输出)。
-规则替换驱动的符号式编程。虽然 Python 不需要事先声明变量(这对软件工程来讲是个大坑,但是对科研思维下的简单计算是极好的),但毕竟要赋值才能使用。Mathematica 直接用符号替换来驱动计算,没有赋值的符号就是公式中的符号。这样也是完全顺着科研思路走的。
-函数式编程。从 Wolfram 最初设计 Mathematica 的手稿,可以清楚地看出 Mathematica 深受 LISP 等函数式语言的影响。例如
虽然 Python 也一定程度支持函数式编程,但是远远没有 Mathematica 方便和彻底。比如#1(#2)& 这种快速匿名函数,If 语句的返回值,表达式零指标留给表达式头等。因为理论研究主要是面对公式的,函数式编程具有优越性。
-内置函数多,命名规则统一。Python 需要调包不说,函数命名规则、调用规则、调用方式等不统一,气死强迫症。(随着 Mathematica 发展越来越庞大,有规则不统一的情况,例如函数的 Option 有些是保留字,有些是字符串。应该一开始统一设计成字符串。不过总体来讲是好多了。)
-公式输入方便,二维输入直观易懂。有人说在 Mathematica 上打公式像弹钢琴。
-文档方便。虽然 Python 的文档已经很好了,但是还是比不上 Mathematica 在帮助文件里面可以自己改改运行那么方便。
总结一下,作为一个搞研究过程中随手用的工具,用 Mathematica,可以一直用搞研究的思维,纯粹把 Mathematica 作为一个工具。用 Python,就需要在研究思维和程序员思维之间不断切换,这样对研究效率有巨大损害。
-使用更广。这个很大程度是习惯问题,但往往是决定性的。
-免费。其实现在 Mathematica 也有免费的版本,叫 Wolfram Engine,只支持命令行。可以和 Jupyter 配合使用,但是开放程度还是不如 Python。
-程序包更方便。Mathematica 写程序包语法麻烦很多,也不够现代化。不如 Python 直接写个文件,再 import 即可,也具有包管理、打包分发等特性。
-支持多范式编程。不同问题适合用不同范式解决。Python 支持多范式,很多问题就更方便,比如面向对象。
-原生支持更多数据结构。Mathematica 写个链表都要用{a,{b,{c,{d}}}}这样的奇技淫巧。
-比 Mathematica 稍快一点。Mathematica 可以用 Packed Array、编译等技术提速,但如果随手写的话,是比 Python 慢的。比如,我以前写的一个简单循环程序,各个语言执行时间对比如下
总结一下,从软件工程的角度,Python 更容易写出规范的程序。如果需要写很长的程序,一直处于程序员思维状态,Python 的优势就慢慢体现出来了。(当然,Python 虽然对科研人员来说不够随意,在软件工程的角度,已经因为过于随意而广受诟病了。)