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 服务器、串行端口访问等)
免费和开源软件,广泛传播,拥有充满活力的社区。
各种强大的工作环境,例如 IPython、Spyder、Jupyter 笔记本、Pycharm、Visual Studio Code
- 缺点:
并非所有算法都可以在更专业的软件或工具箱中找到。
1.1.2. 科学 Python 生态系统¶
与 Matlab 或 R 不同,Python 没有预捆绑的科学计算模块集。以下是可组合在一起以获得科学计算环境的基本构建块
Python,一种通用且现代的计算语言
语言:流程控制、数据类型(
string
、int
)、数据集合(列表、字典)等。标准库模块:字符串处理、文件管理、简单网络协议。
大量用 Python 编写的专用模块或应用程序:Web 框架等……以及科学计算。
开发工具(自动测试、文档生成)
另请参阅
核心数值库
NumPy:使用强大的 数值数组 对象进行数值计算,以及用于操作它们的例程。 https://numpy.com.cn/
另请参阅
SciPy:高级数值例程。优化、回归、插值等 https://scipy.org.cn/
另请参阅
Matplotlib:二维可视化,“出版物级”绘图 https://matplotlib.net.cn/
另请参阅
高级交互式环境:
IPython,一个高级 Python 控制台 https://ipython.pythonlang.cn/
Jupyter,浏览器中的 笔记本 https://jupyter.pythonlang.cn/
特定领域软件包,
以及 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
另请参阅
IPython 用户手册:https://ipython-docs.pythonlang.cn/en/stable/
Jupyter Notebook 快速入门:https://jupyter-docs.pythonlang.cn/en/latest/start/index.html
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
魔术函数 控制台和笔记本通过在命令前添加 %
字符来支持所谓的 魔术 函数。例如,前一节中的 run
和 whos
函数是魔术函数。请注意,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
时将显示所有别名的完整列表)。