为什么选择Python?

Python的优点

虽然为了提高速度的那些代码必须使用编译语言实现,但Sage的基本语言是Python(参见Py)。Python有几个优点:

  • Python对保存对象支持的很好。在Python中,可以将几乎所有的对象保存到磁盘文件或数据库中。
  • 源码中函数和包有好的文档支持,包括自动提取文档和自动测试所有例子。例子被自动测试以保证可以正确工作。
  • 内存管理:Python拥有良好的健壮的内存管理和回收机制,可以正确处理循环引用,并且在文件中允许使用局部变量。
  • Python有很多包可能是Sage用户很感兴趣的:数值分析和线性代数,二维和三维可视化,网络(用于分布式计算和服务器),数据库,等等。
  • 可移植性: 在很多平台上,Python可以很容易由源码编译。
  • 异常处理:Python有精心设计的高级异常处理系统,当所调用的代码出错时也能恢复。
  • 调试:Python包括一个调试器,当代码由于某种原因失败时,用户可以访问扩展堆栈,查看所有相关变量,以及上下移动堆栈。
  • 性能分析器:Python的性能分析器可以运行代码并建立详细的报告,包括每个函数被调用了多少次,运行时间等。
  • 统一语言: 不象Magma, Maple, Mathematica, Matlab, GP/PARI, GAP,Macaular 2, Simath等软件那样,为数学又新建一种语言,我们使用的Python语言是流行的计算机语言,由许多有经验的工程师开发和优化。Python成熟的开发过程是开源软件成功的实例(参见PyDev).

预处理器:Sage与Python的差别

Python的某些数学方面容易让人弄混,因此Sage在这些方面与Python不同。

  • 指数的记号:**^.Python中,^是”异或”的意思,而不是指数,所以在Python中有
    1. >>> 2^8
    2. 10
    3. >>> 3^2
    4. 1
    5. >>> 3**2
    6. 9

^的这种用法看上去很奇怪,在数学研究中也没什么用,因为很少用”异或”。为了方便,Sage在将命令传给Python之前,先进行预处理,将不是字符串中的^替换为**.

  1. sage: 2^8
  2. 256
  3. sage: 3^2
  4. 9
  5. sage: "3^2"
  6. '3^2'
  • 整数除法:Python表达式2/3不会产生数学家期待的结果。Python2中,如果mn都是整数,那么m/n也是整数, 即m除以n的商。所以2/3=0.在Python3里2/3的结果为0.6666...//在Python2与3中表示欧几里得除法,2//3返回0.

    我们在Sage解释器中处理这个问题,将字面的整数转为Integer(),并使除法作为有理数的构造器。如:

    1. sage: 2/3
    2. 2/3
    3. sage: (2/3).parent()
    4. Rational Field
    5. sage: 2//3
    6. 0
    7. sage: int(2)/int(3)
    8. 0
  • 长整数:除C的整型外,Python本身支持任意精度的整数。这比GMP所提供的整型要慢的多,而且输出时末尾会有一个L以便与整型区分(这个性质短期内不会改变)。Sage使用GMP的C语言库实现任意精度的整型,并且输出时没有L.

我们不是去修改Python的解释器(有些人在内部项目中是这样做的),我们用的就是Python语言本身,只是为IPython增加了一个预处理器,使得命令行的工作方式与数学家的习惯一致。这意味着已有的Python代码都可以用于Sage。然而在编写一个要导入Sage的包时,还是要遵守标准Python的规则。

(要安装一个Python库,比如你从互联网上找的,跟着指南做就行,只是要执行sage -python而不是python. 多数情况下是输入sage -python setup.py install.)