1.1. Python科学计算生态系统

作者Fernando Perez、Emmanuelle Gouillart、GaëlVaroquaux、Valentin Haenel

1.1.1. 为什么选择Python?

1.1.1.1. 科学家的需要

  • 获取数据(模拟、实验控制),
  • 操纵和处理数据,
  • 可视化结果、快速理解,而且有高质量的图片用于报告或出版物。

1.1.1.2. Python的优势

  • Batteries included 已存在丰富的经典数值方法、绘图或数据处理工具模块我们不想重新编程绘制曲线、傅立叶变换或拟合算法。不要重复发明轮子!
  • 易于学习 大多数科学家不是程序员,他们都没有受过培训。他们需要能够绘制曲线、平滑信号、在几分钟内进行傅立叶变换。
  • 轻松沟通 为了在实验室或公司内保持代码的活力,对于协作者、学生或者客户它应该像书一样可读。Python语法很简单,避免了奇怪的符号或冗长的例行规范,这将使得读者容易理解代码的数学或科学。
  • 高效代码 Python数值模块在计算上是高效的。但不用说,如果太多的时间花在写它,一个非常快的代码变得无用。Python旨在快速开发时间和快速执行时间。
  • 通用 Python是用于许多不同问题的语言。学习Python避免为每个新问题学习一个新软件。

1.1.1.3. Python与其他解决方案比较起来如何?

1.1.1.3.1. 编译语言:C、C++、Fortran ...

优点:
  • 非常快。对于繁重的计算,很难超越这些语言。
缺点:
  • 痛苦的使用:在开发期间没有交互性,强制编译步骤,详细的语法,手动内存管理。对于非程序员来说,这些是困难的语言

1.1.1.3.2. Matlab脚本语言

优点:
  • 非常丰富的库集合,具有众多算法,适用于许多不同的领域。快速执行,因为这些库通常是用编译语言编写的。
  • 愉快的开发环境:全面的帮助、集成编辑器等。
  • 提供商业支持。
缺点:
  • 基本语言相当差,对高级用户可能会成为限制。
  • 不是免费的。

1.1.1.3.3. Julia

优点:
  • 编码快速,但是是交互式的且简单。
  • 轻松连接到Python或C。
缺点:
  • 生态系统仅限于数值计算。
  • 仍然年轻。

1.1.1.3.4. 其他脚本语言:Scilab、Octave、R、IDL等

优点:
  • 开源、免费或至少比Matlab便宜。
  • 一些功能可以非常高级(R中的统计信息等)
缺点:
  • 可用的算法比Matlab少,并且语言不是更先进。
  • 一些软件专用于一个域。例如:Gnuplot绘制曲线。这些程序非常强大,但它们仅限于单一类型的使用,如绘图。

1.1.1.3.5. Python

优点:
  • 非常丰富的科学计算库
  • 精心设计的语言,允许编写非常可读和结构良好的代码:我们“编码我们的想法”。
  • 除科学计算之外还有许多库(web服务器、串行端口访问等)
  • 免费和开源软件、广泛传播、与一个充满活力的社区。
  • 各种强大的工作环境,如IPythonSpyderJupyter notebooksPycharm
缺点:
  • 不是所有的算法都可以在更专业的软件或工具箱中找到。

1.1.2. Python科学计算生态系统

与Matlab或R不同,Python不提供用于预捆绑的科学计算模块集。下面是可以组合以获得科学计算环境的基本构建:

Python,一种通用和现代的计算语言

  • 语言:流控制、数据类型(stringint)、数据容器(列表、字典)等。
  • 标准库模块:字符串处理、文件管理、简单的网络协议。
  • 大量用Python编写的专门模块或应用程序:web框架等...和科学计算。
  • 开发工具(自动测试,文档生成)
../_images/random_c.jpg

核心数值库

../_images/snapshot_ipython.png

高级交互式环境

../_images/example_surface_from_irregular_data.jpg

特定领域的包

以及更多的没有记录在这个scipy讲义中的包。

1.1.3. 开始之前:安装工作环境

Python有很多形式,有很多方法来安装它。但是,我们建议安装一个科学计算的分布版,它已经自带优化版的科学计算模块。

在Linux

如果你有最近的发行版,大多数工具可能已打包,建议使用你的包管理器。

其他系统

有几个功能完备的科学计算Python分布:

Python 3或Python 2?

2008年,Python 3发布。这是一个重大的演变,语言做了一些改变。一些旧的科学计算代码尚未在Python 3下运行。但是,这并不常见,Python 3带来了许多好处。我们建议你安装Python 3。

1.1.4. 工作流程:交互式环境和文本编辑器

测试和理解算法的交互式工作:在本节中,我们将描述一个结合交互式工作和合并的工作流程。

Python是一种通用语言。因此,工作环境不会糟糕,并且使用它的方式不只有一种。虽然这使得初学者更难找到自己的方式,它使Python可以用于在Web服务器或嵌入式设备中编程。

1.1.4.1. 交互式工作

我们建议你使用IPython控制台或其衍生产品Jupyter notebook进行交互式工作。它们对于探索和理解算法很方便。

启动ipython

In [1]: print('Hello world')
Hello world

在对象后使用运算符获取帮助:

In [2]: print?
Type: builtin_function_or_method
Base Class: <type 'builtin_function_or_method'>
String Form: <built-in function print>
Namespace: Python builtin
Docstring:
print(value, ..., sep=' ', end='\n', file=sys.stdout)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.

1.1.4.2. 在编辑器中详细说明工作

当你继续向前时,不仅要以交互方式工作,而且创建和重用Python文件也很重要。为此,一个强大的代码编辑器将让你走得更远。这里有几个很好的易于使用的编辑器:

  • Spyder:集成了IPython控制台、调试器、分析器...
  • PyCharm:集成了IPython控制台、notebooks、调试器...(自由获取,但是是商业许可)
  • Atom

其中一些自带各种科学计算Python的发行版,你可以在菜单中找到它们。

作为练习,在代码编辑器中创建文件my_file.py,然后添加以下行:

s = 'Hello world'
print(s)

现在,你可以在IPython控制台或notebook中运行它,并浏览生成的变量:

In [1]: %run my_file.py
Hello world
In [2]: s
Out[2]: 'Hello world'
In [3]: %whos
Variable Type Data/Info
----------------------------
s str Hello world

从脚本到函数

虽然只使用脚本很有吸引力,但它是一个充满指令的文件,这些指令一个接一个,请逐步将脚本演变成一组函数:

  • 脚本不可重用,函数可以。
  • 以函数的方式思考有助于将问题分解成多个小问题。

1.1.4.3. IPython和Jupyter提示和技巧

用户手册包含大量信息。在这里,我们快速介绍四个有用的功能:命令历史制表符补全魔法函数别名

命令历史 像UNIX shell一样,IPython控制台支持命令历史记录。键入向上键向下键来导航以前输入的命令:

In [1]: x = 10
In [2]: <UP>
In [2]: x = 10

制表符补全 制表符补全,是探索你正在处理的任何对象的结构的一种方便的方式。只需键入object_name.即可查看对象的属性。除了Python对象和关键字,制表符补全也适用于文件和目录names.*

In [1]: x = 10
In [2]: x.<TAB>
x.bit_length x.denominator x.imag x.real
x.conjugate x.from_bytes x.numerator x.to_bytes

魔法函数 控制台和notebooks通过在命令前加上%字符,支持所谓的魔法函数。例如,上一节的runwhos函数是魔法函数。请注意,默认情况下启用的设置automagic允许你省略前面的%符号。因此,你可以只输入魔法函数,它会工作。

其他有用的魔法函数有:

  • %cd更改当前目录。

    In [1]: cd /tmp
    
    /tmp
  • %cpaste允许你粘贴代码,特别是来自网站的代码,以标准Python提示符(例如>>>)或ipython提示符(例如in [3])作为前缀:

    In [2]: %cpaste
    
    Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
    :>>> for i in range(3):
    :... print(i)
    :--
    0
    1
    2
  • %timeit允许你使用标准库中的timeit模块计算短片段的执行时间:

    In [3]: %timeit x = 10
    
    10000000 loops, best of 3: 39 ns per loop
  • %debug允许你输入事后调试。也就是说,如果你尝试执行的代码引发异常,使用%debug将在抛出异常的地方进入调试器。

    In [4]: x === 10
    
    File "<ipython-input-6-12fd421b5f28>", line 1
    x === 10
    ^
    SyntaxError: invalid syntax
    In [5]: %debug
    > /.../IPython/core/compilerop.py (87)ast_parse()
    86 and are passed to the built-in compile function."""
    ---> 87 return compile(source, filename, symbol, self.flags | PyCF_ONLY_AST, 1)
    88
    ipdb>locals()
    {'source': u'x === 10\n', 'symbol': 'exec', 'self':
    <IPython.core.compilerop.CachingCompiler instance at 0x2ad8ef0>,
    'filename': '<ipython-input-6-12fd421b5f28>'}

    另见

    调试一章

别名 此外,IPython附带各种别名,它们模拟常见的UNIX命令行工具,例如ls列出文件、cp复制文件和rm删除文件(键入alias时会显示完整的别名列表)。

获取帮助

  • 内置的备忘单可通过%quickref魔法函数访问。
  • 键入%magic时,将显示所有可用魔法函数的列表。