1.1. Python 科学计算生态系统

作者: Fernando Perez, Emmanuelle Gouillart, Gaël Varoquaux, Valentin Haenel

1.1.1. 为什么选择 Python?

1.1.1.1. 科学家的需求

  • 获取数据(模拟、实验控制),

  • 操作和处理数据,

  • 可视化结果,快速理解,但也需要高质量的图形,用于报告或出版物。

1.1.1.2. Python 的优势

  • 内置电池 丰富的现成 积木,包括经典数值方法、绘图或数据处理工具。我们不想重新编程曲线绘制、傅里叶变换或拟合算法。不要重复造轮子!

  • 易于学习 大多数科学家并不被聘为程序员,也没有接受过这方面的训练。他们需要能够在几分钟内绘制曲线、平滑信号、进行傅里叶变换。

  • 易于沟通 为了使代码在实验室或公司内保持活力,它应该像合作者、学生或可能客户阅读的书一样可读。Python 语法简单,避免了奇怪的符号或冗长的例程规范,这些规范会分散读者对代码的数学或科学理解。

  • 高效代码 Python 数值模块具有计算效率。但不用说,如果编写代码花费的时间过长,那么非常快的代码就会变得毫无用处。Python 的目标是快速开发时间和快速执行时间。

  • 通用 Python 是一种用于解决许多不同问题的语言。学习 Python 可以避免为每个新问题学习新的软件。

1.1.1.3. Python 与其他解决方案相比如何?

编译语言:C、C++、Fortran…

优点:
  • 非常快。对于繁重的计算,很难超越这些语言。

缺点:
  • 使用痛苦:开发过程中没有交互性,必须进行编译步骤,语法冗长,手动内存管理。这些对于非程序员来说是 困难的语言

Matlab 脚本语言

优点:
  • 非常丰富的库集合,包含许多算法,涵盖许多不同的领域。快速执行,因为这些库通常是用编译语言编写的。

  • 愉快的开发环境:综合帮助、集成编辑器等。

  • 提供商业支持。

缺点:
  • 基础语言非常贫乏,对于高级用户来说可能会变得限制性。

  • 不是免费的,也不是所有内容都是开源的。

Julia

优点:
  • 代码快速,但仍然具有交互性和简单性。

  • 轻松连接到 Python 或 C。

缺点:
  • 生态系统仅限于数值计算。

  • 还很年轻。

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

优点:
  • 开源、免费,或者至少比 Matlab 便宜。

  • 某些功能可能非常先进(R 中的统计等)

缺点:
  • 可用的算法比 Matlab 少,而且语言并不更先进。

  • 一些软件专门用于某个领域。例如:Gnuplot 用于绘制曲线。这些程序非常强大,但它们仅限于单一类型的用途,例如绘图。

Python

优点:
  • 非常丰富的科学计算库

  • 经过精心设计的语言,可以编写非常可读且结构良好的代码:“我们编码我们所想的”。

  • 许多超出科学计算的库(Web 服务器、串行端口访问等)

  • 免费和开源软件,广泛传播,拥有充满活力的社区。

  • 各种强大的工作环境,例如 IPythonSpyderJupyter 笔记本PycharmVisual Studio Code

缺点:
  • 并非所有算法都可以在更专业的软件或工具箱中找到。

1.1.2. 科学 Python 生态系统

与 Matlab 或 R 不同,Python 没有预捆绑的科学计算模块集。以下是可组合在一起以获得科学计算环境的基本构建块


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

  • 语言:流程控制、数据类型(stringint)、数据集合(列表、字典)等。

  • 标准库模块:字符串处理、文件管理、简单网络协议。

  • 大量用 Python 编写的专用模块或应用程序:Web 框架等……以及科学计算。

  • 开发工具(自动测试、文档生成)

核心数值库

高级交互式环境:

特定领域软件包,

以及 Scientific Python 讲座中未记录的许多其他软件包。

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

Python 有很多版本,安装方法也有很多。但是,我们建议安装一个科学计算发行版,该发行版预先提供科学模块的优化版本。

在 Linux 下

如果您使用的是最新发行版,大多数工具可能已经打包,建议使用您的包管理器。

其他系统

有几个功能齐全的科学 Python 发行版

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

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

Python 是一种通用语言。因此,没有一个受祝福的工作环境,也不只有一种使用方式。虽然这使得初学者难以找到方向,但它使 Python 可以用于程序、Web 服务器或嵌入式设备。

1.1.4.1. 交互式工作

我们建议使用 IPython 控制台或其后代 Jupyter 笔记本 进行交互式工作。它们非常方便探索和理解算法。

启动 ipython

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

通过在对象后使用 ? 运算符获取帮助

In [2]: print?
Signature: print(*args, sep=' ', end='\n', file=None, flush=False)
Docstring:
Prints the values to a stream, or to sys.stdout by default.
sep
string inserted between values, default a space.
end
string appended after the last value, default a newline.
file
a file-like object (stream); defaults to the current sys.stdout.
flush
whether to forcibly flush the stream.
Type: builtin_function_or_method

另请参阅

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

随着您的进步,不仅要进行交互式工作,还要创建和重用 Python 文件。为此,功能强大的代码编辑器将让您事半功倍。以下是一些易于使用且优秀的编辑器

  • Spyder:集成了 IPython 控制台、调试器、分析器……

  • PyCharm:集成了 IPython 控制台、笔记本、调试器……(免费提供,但商业化)

  • Visual Studio Code:集成了 Python 控制台、笔记本、调试器……

其中一些由各种科学 Python 发行版提供,您可以在菜单中找到它们。

作为一个练习,在代码编辑器中创建一个名为 my_file.py 的文件,并添加以下行

s = 'Hello world'
print(s)

现在,您可以在 IPython 控制台或笔记本中运行它,并探索生成的变量

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

1.1.4.3. IPython 和 Jupyter 提示和技巧

用户手册包含大量信息。在这里,我们简要介绍四个有用的功能:历史记录制表符补全魔术函数别名


命令历史记录 与 UNIX shell 一样,IPython 控制台支持命令历史记录。键入 向上向下 浏览之前键入的命令

In [6]: x = 10
In [7]: <UP>
In [8]: x = 10

制表符补全 制表符补全是探索您正在处理的任何对象的结构的便捷方法。只需键入 object_name.<TAB> 即可查看对象的属性。除了 Python 对象和关键字外,制表符补全还适用于文件和目录名称。*

In [9]: x = 10
In [10]: x.<TAB>
as_integer_ratio() conjugate() imag to_bytes()
bit_count() denominator numerator
bit_length() from_bytes() real

魔术函数 控制台和笔记本通过在命令前添加 % 字符来支持所谓的 魔术 函数。例如,前一节中的 runwhos 函数是魔术函数。请注意,automagic 设置(默认情况下已启用)允许您省略前面的 % 符号。因此,您只需键入魔术函数,它就会起作用。

其他有用的魔术函数是

  • %cd 用于更改当前目录。

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

    In [12]: %cpaste
    
  • %timeit 允许您使用标准库中的 timeit 模块来计时短代码片段的执行。

    In [12]: %timeit x = 10
    
    10.2 ns +- 0.82 ns per loop (mean +- std. dev. of 7 runs, 100,000,000 loops each)

    另请参阅

    优化代码章节

  • %debug 允许您进入事后调试。也就是说,如果您尝试执行的代码引发了异常,使用 %debug 将在异常被抛出的地方进入调试器。

    In [13]: x === 10
    
    Cell In[13], line 1
    x === 10
    ^
    SyntaxError: invalid syntax
    In [14]: %debug
    > /home/jarrod/.venv/lectures/lib64/python3.11/site-packages/IPython/core/compilerop.py(86)ast_parse()
    84 Arguments are exactly the same as ast.parse (in the standard library),
    85 and are passed to the built-in compile function."""
    ---> 86 return compile(source, filename, symbol, self.flags | PyCF_ONLY_AST, 1)
    87
    88 def reset_compiler_flags(self):
    ipdb> locals()
    {'self': <IPython.core.compilerop.CachingCompiler object at 0x7f30d02efc10>, 'source': 'x === 10\n', 'filename': '<ipython-input-1-8e8bc565444b>', 'symbol': 'exec'}
    ipdb>

    另请参阅

    调试章节


别名 此外,IPython 附带各种别名,这些别名模拟常用的 UNIX 命令行工具,例如 ls 用于列出文件,cp 用于复制文件,rm 用于删除文件(键入 alias 时将显示所有别名的完整列表)。