为什么选择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中有>>> 2^8
10
>>> 3^2
1
>>> 3**2
9
^
的这种用法看上去很奇怪,在数学研究中也没什么用,因为很少用”异或”。为了方便,Sage在将命令传给Python之前,先进行预处理,将不是字符串中的^
替换为**
.
sage: 2^8
256
sage: 3^2
9
sage: "3^2"
'3^2'
整数除法:Python表达式
2/3
不会产生数学家期待的结果。Python2中,如果m
和n
都是整数,那么m/n
也是整数, 即m
除以n
的商。所以2/3=0
.在Python3里2/3
的结果为0.6666...
。//
在Python2与3中表示欧几里得除法,2//3
返回0
.我们在Sage解释器中处理这个问题,将字面的整数转为
Integer()
,并使除法作为有理数的构造器。如:sage: 2/3
2/3
sage: (2/3).parent()
Rational Field
sage: 2//3
0
sage: int(2)/int(3)
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
.)