提交 fc916f1e 编写于 作者: W wizardforcel

2020-07-24 22:29:58

上级 3729418b
......@@ -41,7 +41,7 @@
# 这本书适合谁
如果您了解 Python,但对科学编程还是陌生的,并且想进入科学计算的世界,或者您是具有分析经验的 Python 开发人员,但想获得洞察力来增强您的分析技能。 无论哪种情况,NumPy 或这本书都是您的理想选择。 学习 NumPy 以及如何将 NumPy 应用于 Python 程序非常适合作为构建专业分析应用程序的下一步。 熟悉基本的编程概念和数学会有所帮助,但是不需要任何先验经验。 后面的章节涵盖了诸如包分发,加速代码和 C/C++ 集成之类的概念,这些概念需要一定数量的编程和调试知识。 假定读者能够在其首选的 OS 中构建 C/C++ 程序(在 Linux 和 cygwin / migw 中使用 gcc,在 Windows 中使用 gcc)。
如果您了解 Python,但对科学编程还是陌生的,并且想进入科学计算的世界,或者您是具有分析经验的 Python 开发人员,但想获得洞察力来增强您的分析技能。 无论哪种情况,NumPy 或这本书都是您的理想选择。 学习 NumPy 以及如何将 NumPy 应用于 Python 程序非常适合作为构建专业分析应用的下一步。 熟悉基本的编程概念和数学会有所帮助,但是不需要任何先验经验。 后面的章节涵盖了诸如包分发,加速代码和 C/C++ 集成之类的概念,这些概念需要一定数量的编程和调试知识。 假定读者能够在其首选的 OS 中构建 C/C++ 程序(在 Linux 和 cygwin / migw 中使用 gcc,在 Windows 中使用 gcc)。
# 约定
......
......@@ -4,16 +4,16 @@
>
> -- John D Cook
在过去的十年中,Python 已成为科学计算中最受欢迎的编程语言之一。 其成功的原因很多,随着您着手本书,这些原因将逐渐变得明显。 与许多其他数学语言(例如 MATLAB,R 和 Mathematica)不同,Python 是一种通用编程语言。 因此,它为构建科学应用程序并将其进一步扩展到任何商业或学术领域提供了合适的框架。 例如,考虑一个(某种)简单的应用程序,该应用程序要求您编写软件并预测博客文章的受欢迎程度。 通常,这些是您要执行此操作的步骤:
在过去的十年中,Python 已成为科学计算中最受欢迎的编程语言之一。 其成功的原因很多,随着您着手本书,这些原因将逐渐变得明显。 与许多其他数学语言(例如 MATLAB,R 和 Mathematica)不同,Python 是一种通用编程语言。 因此,它为构建科学应用并将其进一步扩展到任何商业或学术领域提供了合适的框架。 例如,考虑一个(某种)简单的应用,该应用要求您编写软件并预测博客文章的受欢迎程度。 通常,这些是您要执行此操作的步骤:
1. 生成博客文章及其相应评级的语料库(假设此处的评级可适当量化)。
2. 制定一个模型,该模型根据与博客文章相关的内容和其他数据生成评分。
3. 根据您在步骤 1 中找到的数据来训练模型。请继续进行此操作,直到您对模型的可靠性充满信心为止。
4. 将模型部署为 Web 服务。
通常,在执行这些步骤时,您会发现自己在不同的软件堆栈之间跳转。 第 1 步需要进行大量的网页抓取。 Web 抓取是一个非常普遍的问题,几乎每种编程语言都有一些工具可以抓取 Web(如果您已经在使用 Python,则可能会选择 BeautifulSoup 或 Scrapy)。 第 2 步和第 3 步涉及解决机器学习问题,并且需要使用复杂的数学语言或框架,例如 Weka 或 MATLAB,这只是提供机器学习功能的众多工具中的少数几种。 同样,步骤 4 可以使用许多不同的工具以多种方式实现。 没有一个正确的答案。 由于这个问题已经被许多科学家和软件开发人员充分研究和解决(在一定程度上),因此,找到可行的解决方案并不困难。 但是,诸如稳定性和可伸缩性之类的问题可能会严重限制您在问题的每个步骤中对编程语言,Web 框架或机器学习算法的选择。 这就是 Python 胜过大多数其他编程语言的地方。 前面的所有步骤(以及更多步骤)都只能使用 Python 和一些第三方 Python 库来完成。 这种使用 Python 开发软件的灵活性和便捷性正是使其成为科学计算生态系统的理想宿主。 在 *Ivan Idris* 所写的《Python 数据分析》中可以找到关于 Python 作为成熟的应用程序开发语言的非常有趣的解释。精确地讲,Python 是一种用于快速原型制作的语言,并且由于其随着时间的推移而获得了广泛的科学生态系统,它也被用于构建生产质量的软件。 这个生态系统的基础是 NumPy。
通常,在执行这些步骤时,您会发现自己在不同的软件堆栈之间跳转。 第 1 步需要进行大量的网页抓取。 Web 抓取是一个非常普遍的问题,几乎每种编程语言都有一些工具可以抓取 Web(如果您已经在使用 Python,则可能会选择 BeautifulSoup 或 Scrapy)。 第 2 步和第 3 步涉及解决机器学习问题,并且需要使用复杂的数学语言或框架,例如 Weka 或 MATLAB,这只是提供机器学习功能的众多工具中的少数几种。 同样,步骤 4 可以使用许多不同的工具以多种方式实现。 没有一个正确的答案。 由于这个问题已经被许多科学家和软件开发人员充分研究和解决(在一定程度上),因此,找到可行的解决方案并不困难。 但是,诸如稳定性和可伸缩性之类的问题可能会严重限制您在问题的每个步骤中对编程语言,Web 框架或机器学习算法的选择。 这就是 Python 胜过大多数其他编程语言的地方。 前面的所有步骤(以及更多步骤)都只能使用 Python 和一些第三方 Python 库来完成。 这种使用 Python 开发软件的灵活性和便捷性正是使其成为科学计算生态系统的理想宿主。 在 *Ivan Idris* 所写的《Python 数据分析》中可以找到关于 Python 作为成熟的应用开发语言的非常有趣的解释。精确地讲,Python 是一种用于快速原型制作的语言,并且由于其随着时间的推移而获得了广泛的科学生态系统,它也被用于构建生产质量的软件。 这个生态系统的基础是 NumPy。
**数字 Python****NumPy**)是 Numeric 包的后续产品。 它最初由 Travis Oliphant 编写,是 Python 科学计算环境的基础。 它在 2005 年初从功能更广泛的 SciPy 模块分支出来,并于 2006 年中首次稳定发布。 从那以后,它在从事数学,科学和工程领域的 Python 爱好者中越来越受欢迎。 本书的目的是使您对 NumPy 足够熟悉,以便您能够使用它并使用它构建复杂的科学应用程序
**数字 Python****NumPy**)是 Numeric 包的后续产品。 它最初由 Travis Oliphant 编写,是 Python 科学计算环境的基础。 它在 2005 年初从功能更广泛的 SciPy 模块分支出来,并于 2006 年中首次稳定发布。 从那以后,它在从事数学,科学和工程领域的 Python 爱好者中越来越受欢迎。 本书的目的是使您对 NumPy 足够熟悉,以便您能够使用它并使用它构建复杂的科学应用。
# 科学的 Python 堆栈
......@@ -49,7 +49,7 @@ IPython 的主要作者 Fernando Perez 在 2012 年加拿大 PyCon 的主题演
## 易于开发
NumPy 模块是用于数学任务的现成功能的强大平台。 它极大地增加了 Python 的开发难度。 以下是该模块包含的内容的简要概述,我们将在本书中探讨其中的大部分内容。 有关 NumPy 模块的详细介绍,请参见 *Travis Oliphat* 所写的权威的《NumPy 指南》。 NumPy API 非常灵活,以至于科学 Python 社区已广泛采用它作为构建科学应用程序的标准 API。 可以参考 *Van Der Walt* 等人所写的《NumPy 数组:有效数值计算的结构》:
NumPy 模块是用于数学任务的现成功能的强大平台。 它极大地增加了 Python 的开发难度。 以下是该模块包含的内容的简要概述,我们将在本书中探讨其中的大部分内容。 有关 NumPy 模块的详细介绍,请参见 *Travis Oliphat* 所写的权威的《NumPy 指南》。 NumPy API 非常灵活,以至于科学 Python 社区已广泛采用它作为构建科学应用的标准 API。 可以参考 *Van Der Walt* 等人所写的《NumPy 数组:有效数值计算的结构》:
| **子模块** | **内容** |
| --- | --- |
......@@ -64,7 +64,7 @@ NumPy 模块是用于数学任务的现成功能的强大平台。 它极大地
# 学术界和工业界的 NumPy
有人说,如果您在时代广场站足够长的时间,就会遇到世界上每个人。 现在,您必须已经确信 NumPy 是 SciPy 的时代广场。 如果您使用 Python 编写科学应用程序,那么不需深入研究 NumPy,您将无能为力。 图 2 显示了不同抽象级别的科学计算中 SciPy 的范围。 红色箭头表示科学软件应具有的各种低级功能,蓝色箭头表示利用这些功能的不同应用程序领域。 配备 SciPy 栈的 Python 处于提供这些功能的语言的最前沿。
有人说,如果您在时代广场站足够长的时间,就会遇到世界上每个人。 现在,您必须已经确信 NumPy 是 SciPy 的时代广场。 如果您使用 Python 编写科学应用,那么不需深入研究 NumPy,您将无能为力。 图 2 显示了不同抽象级别的科学计算中 SciPy 的范围。 红色箭头表示科学软件应具有的各种低级功能,蓝色箭头表示利用这些功能的不同应用领域。 配备 SciPy 栈的 Python 处于提供这些功能的语言的最前沿。
Google 学术搜索 NumPy 会返回近 6,280 个结果。 其中一些是有关 NumPy 和 SciPy 栈本身的论文和文章,还有许多是有关 NumPy 在各种研究问题中的应用的。 学者们喜欢 Python,SciPy 栈作为世界上无数大学和研究实验室中科学编程的主要语言越来越受欢迎,这说明了 Python。 许多科学家和软件专业人员的经验已发布在 Python 网站上:
......
......@@ -35,7 +35,7 @@ matrix([[1., 0., 0.],
```
有两种创建或转换为 NumPy 矩阵对象的方法,更优选的方法是使用`numpy.mat()``numpy.matrix()`。 两种方法都创建矩阵,但是`numpy.matrix()`创建一个副本,而`numpy.mat()`仅更改视图; 等效于`numpy.matrix(data, copy = False)`。 在前面的示例中,我们创建了两个矩阵,两个矩阵均来自`ndarray`对象(`np.identity(3)`返回 3 x 3 的标识数组)。 当然,您可以使用字符串或列表来创建矩阵,例如:`np.matrix('0 1 2; 3 4 5; 6 7 8')``np.matrix([[0,1,2],[3,4,5],[6,7,8]])`将创建与`x`相同的矩阵。 在以下示例中,我们将执行一些基本的矩阵运算:
有两种创建或转换为 NumPy 矩阵对象的方法,更优选的方法是使用`numpy.mat()``numpy.matrix()`。 两种方法都创建矩阵,但是`numpy.matrix()`创建一个副本,而`numpy.mat()`仅更改视图; 等效于`numpy.matrix(data, copy = False)`。 在前面的示例中,我们创建了两个矩阵,两个矩阵均来自`ndarray`对象(`np.identity(3)`返回`3 x 3`的单位数组)。 当然,您可以使用字符串或列表来创建矩阵,例如:`np.matrix('0 1 2; 3 4 5; 6 7 8')``np.matrix([[0,1,2],[3,4,5],[6,7,8]])`将创建与`x`相同的矩阵。 在以下示例中,我们将执行一些基本的矩阵运算:
```py
In [7]: x + y
......@@ -120,7 +120,7 @@ In [23]: %timeit y.T
```
此示例显示了转置时`ndarray``matrix`之间的巨大性能差异。 `x``y`都具有 5,000 x 5,000 元素,但是`x`是二维`ndarray`,而`y`将其转换为相同的形状`matrix`。 即使计算已通过 NumPy 优化,NumPy 矩阵也将始终以矩阵方式进行运算。
此示例显示了转置时`ndarray``matrix`之间的巨大性能差异。 `x``y`都具有`5,000 x 5,000`元素,但是`x`是二维`ndarray`,而`y`将其转换为相同的形状`matrix`。 即使计算已通过 NumPy 优化,NumPy 矩阵也将始终以矩阵方式进行运算。
虽然默认情况下`ndarray`会反转尺寸而不是对轴进行置换(矩阵始终对轴进行置换),但这是`ndarray`中完成的一项巨大的性能改进技巧。 因此,考虑到线性代数的性能,`ndarray` 特别适用于大型数据集。 仅在必要时使用`matrix`。 在继续下一节之前,让我们看一下另外两个`matrix`对象属性,这些属性将`matrix`转换​​为基本的`ndarray`
......@@ -167,7 +167,7 @@ Out[29]: 300
![Linear algebra in NumPy](img/00011.jpeg)
`numpy.outer()`函数是两个向量的外积。 如果输入数组不是一维的,则它将变平。 假设扁平化的输入向量 A 的形状为`(M, )`,扁平化的输入向量 B 的形状为`(N, )`。 那么结果形状将是`(M, N)`
`numpy.outer()`函数是两个向量的外积。 如果输入数组不是一维的,则它将变平。 假设扁平化的输入向量`A`的形状为`(M, )`,扁平化的输入向量`B`的形状为`(N, )`。 那么结果形状将是`(M, N)`
```py
In [100]: np.outer(x,y)
......@@ -267,7 +267,7 @@ array([[ 0., 0.0384, 0.6834]
```
在前面的示例中,首先我们使用`numpy.random.randint` `()`创建了一个 3 x 3 `ndarray`,然后使用`np.linalg.eig()`计算了特征值和特征向量。 该函数返回两个元组:第一个元组是特征值,每个元组根据其多重性重复;第二个元组是规范化的特征向量,其中`v[: , i]`列是与特征值`w[i]`相对应的特征向量。 在此示例中,我们将元组解压缩为`w``v`。 如果输入`ndarray`是复数值,则计算出的特征向量也将是复数类型,如下面的示例所示:
在前面的示例中,首先我们使用`numpy.random.randint` `()`创建了一个`3 x 3``ndarray`,然后使用`np.linalg.eig()`计算了特征值和特征向量。 该函数返回两个元组:第一个元组是特征值,每个元组根据其多重性重复;第二个元组是规范化的特征向量,其中`v[: , i]`列是与特征值`w[i]`相对应的特征向量。 在此示例中,我们将元组解压缩为`w``v`。 如果输入`ndarray`是复数值,则计算出的特征向量也将是复数类型,如下面的示例所示:
```py
In [45]: y = np.array([[1, 2j],[-3j, 4]])
......@@ -349,7 +349,7 @@ array([[ 0.2667],
```
我们使用`numpy.linalg.qr()`分解`A`以获得`q``r`。 因此现在将原始方程式转换为`(q * r) x = b`。 我们可以使用`r``q``b`的逆矩阵乘法(点积)获得`x`。 由于`q`是一个 unit 矩阵,因此我们使用了转置而不是逆。 如您所见,结果`x`与我们使用矩阵和`numpy.linalg.solve()`时的结果相同; 这是解决线性问题的另一种方法。
我们使用`numpy.linalg.qr()`分解`A`以获得`q``r`。 因此现在将原始方程式转换为`(q * r) x = b`。 我们可以使用`r``q``b`的逆矩阵乘法(点积)获得`x`。 由于`q`是一个单位矩阵,因此我们使用了转置而不是逆。 如您所见,结果`x`与我们使用矩阵和`numpy.linalg.solve()`时的结果相同; 这是解决线性问题的另一种方法。
### 注意
......@@ -549,7 +549,7 @@ Out[101]: 129716.66666666642
![Application - regression and curve fitting](img/00016.jpeg)
NumPy 可以从线性代数中获得许多应用程序,例如插值和外推,但是我们不能在本章中全部介绍它们。 我们希望本章为您使用 NumPy 解决线性或多项式问题提供一个良好的开端。
NumPy 可以从线性代数中获得许多应用,例如插值和外推,但是我们不能在本章中全部介绍它们。 我们希望本章为您使用 NumPy 解决线性或多项式问题提供一个良好的开端。
# 总结
......
# 六、NumPy 中的傅立叶分析
除其他事项外,傅立叶分析通常用于数字信号处理。 这要归功于它在将输入信号(时域)分离为以离散频率(频域)起作用的分量方面如此强大。 开发了另一种快速算法来计算**离散傅里叶变换****DFT**),这就是众所周知的**快速傅里叶变换****FFT**),它为分析及其应用提供了更多可能性。 NumPy 针对数字计算,也支持 FFT。 让我们尝试使用 NumPy 在应用程序上进行一些傅立叶分析! 注意,本章假定不熟悉信号处理或傅立叶方法。
除其他事项外,傅立叶分析通常用于数字信号处理。 这要归功于它在将输入信号(时域)分离为以离散频率(频域)起作用的分量方面如此强大。 开发了另一种快速算法来计算**离散傅里叶变换****DFT**),这就是众所周知的**快速傅里叶变换****FFT**),它为分析及其应用提供了更多可能性。 NumPy 针对数字计算,也支持 FFT。 让我们尝试使用 NumPy 在应用上进行一些傅立叶分析! 注意,本章假定不熟悉信号处理或傅立叶方法。
本章将涉及的主题是:
......@@ -11,7 +11,7 @@
# 开始之前
众所周知,傅里叶分析将函数表示为周期分量的总和(正弦和余弦函数的组合),并且这些分量能够恢复原始函数。 它在数字信号处理(例如滤波,插值等)中具有广泛的应用程序,因此我们在不提供 NumPy 的任何应用程序细节的情况下就不想谈论 NumPy 中的傅立叶分析。 为此,我们需要一个可视化的模块。
众所周知,傅里叶分析将函数表示为周期分量的总和(正弦和余弦函数的组合),并且这些分量能够恢复原始函数。 它在数字信号处理(例如滤波,插值等)中具有广泛的应用,因此我们在不提供 NumPy 的任何应用细节的情况下就不想谈论 NumPy 中的傅立叶分析。 为此,我们需要一个可视化的模块。
Matplotlib 是我们将在本章中使用的可视化模块。 [请从官方网站下载并安装它](http://matplotlib.org/downloads.html)。 或者,如果您正在使用 Anaconda 之类的 Scientific Python 发行版,则应该已经包括了 matplotlib。
......@@ -281,7 +281,7 @@ Out[51]: True
# 傅立叶变换应用
在前面的部分中,您学习了如何将`numpy.fft`用于一个一维和多维`ndarray`,并在幕后了解了实现细节。 现在是一些应用程序的时候了。 在本节中,我们将使用傅立叶变换进行一些图像处理。 我们将分析光谱,然后对图像进行插值以将其放大到两倍大小。 首先,[让我们从 Packt Publishing 网站博客文章中下载练习图像](https://www.packtpub.com/books/content/python-data-scientists)。 将映像另存为本地目录`scientist.png`
在前面的部分中,您学习了如何将`numpy.fft`用于一个一维和多维`ndarray`,并在幕后了解了实现细节。 现在是一些应用的时候了。 在本节中,我们将使用傅立叶变换进行一些图像处理。 我们将分析光谱,然后对图像进行插值以将其放大到两倍大小。 首先,[让我们从 Packt Publishing 网站博客文章中下载练习图像](https://www.packtpub.com/books/content/python-data-scientists)。 将映像另存为本地目录`scientist.png`
![Fourier transform application](img/00027.jpeg)
......
# 七、构建和分发 NumPy 代码
在现实世界中,您将编写一个应用程序,以将其分发到 World 或在其他各种计算机上重用。 为此,您希望应用程序以标准方式打包,以便社区中的每个人都能理解和遵循。 正如您现在已经注意到的那样,Python 用户主要使用名为`pip`的包管理器来自动安装其他程序员创建的模块。 Python 具有一个称为 **PyPI****Python 软件包索引**)的打包平台,该平台是 50,000 多个 Python 软件包的官方中央存储库。 一旦在 PyPi(又名 *Cheese Shop*)中注册了软件包,世界各地的其他用户都可以在使用`pip`等软件包管理系统对其进行配置后进行安装。 Python 随附了许多解决方案,可帮助您构建代码以准备分发给 *Cheese Shop* ,并且在本章中,我们将重点介绍两个此类工具,`setuptools``Distutils` 除了这两个工具之外,我们还将研究 NumPy 提供的称为`numpy.distutils`的特定模块。 该模块使程序员更容易构建和分发特定于 NumPy 的代码。 该模块还提供了其他功能,例如用于编译 Fortran 代码,调用`f2py,`等的方法。 在本章中,我们将通过以下步骤来学习包装工作流程:
在现实世界中,您将编写一个应用,以将其分发到 World 或在其他各种计算机上重用。 为此,您希望应用以标准方式打包,以便社区中的每个人都能理解和遵循。 正如您现在已经注意到的那样,Python 用户主要使用名为`pip`的包管理器来自动安装其他程序员创建的模块。 Python 具有一个称为 **PyPI****Python 软件包索引**)的打包平台,该平台是 50,000 多个 Python 软件包的官方中央存储库。 一旦在 PyPi(又名 *Cheese Shop*)中注册了软件包,世界各地的其他用户都可以在使用`pip`等软件包管理系统对其进行配置后进行安装。 Python 随附了许多解决方案,可帮助您构建代码以准备分发给 *Cheese Shop* ,并且在本章中,我们将重点介绍两个此类工具,`setuptools``Distutils` 除了这两个工具之外,我们还将研究 NumPy 提供的称为`numpy.distutils`的特定模块。 该模块使程序员更容易构建和分发特定于 NumPy 的代码。 该模块还提供了其他功能,例如用于编译 Fortran 代码,调用`f2py,`等的方法。 在本章中,我们将通过以下步骤来学习包装工作流程:
* 我们将建立一个小的但可行的设置
* 我们将说明将 NumPy 模块集成到您的设置中的步骤
* 我们将说明如何在 Internet 上注册和分发您的应用程序
* 我们将说明如何在 Internet 上注册和分发您的应用
# 介绍 Distutils 和 setuptools
......@@ -223,9 +223,9 @@ if __name__ == "__main__":
* 权限和提升的权限要求。
* 某些用户可能对计算机具有只读访问权限。 这很容易被忽略,因为大多数开发人员在自己的机器上都没有这种情况。 如果包的提供者遵循正确的方法来选择要写入的目录,则应该不会出现此问题。 通常,通过使用没有管理员访问权限的用户测试脚本来检查这种情况是一种很好的做法。
# 分发您的应用程序
# 分发您的应用
完成模块/应用程序的所有开发并准备好完整的正常工作的应用程序和设置文件后,下一个任务就是与世界分享您的辛勤工作,使他人受益。 使用 PyPI 将其发布到全世界的步骤非常简单。 作为软件包作者,您需要做的第一件事就是注册自己。 您可以直接从命令行执行以下操作:
完成模块/应用的所有开发并准备好完整的正常工作的应用和设置文件后,下一个任务就是与世界分享您的辛勤工作,使他人受益。 使用 PyPI 将其发布到全世界的步骤非常简单。 作为软件包作者,您需要做的第一件事就是注册自己。 您可以直接从命令行执行以下操作:
```py
**$ python setup.py register
......@@ -252,8 +252,8 @@ if __name__ == "__main__":
```
希望,如果您正确键入了所有内容,您的应用程序将被打包并在 PyPI 上供世界使用。
希望,如果您正确键入了所有内容,您的应用将被打包并在 PyPI 上供世界使用。
# 总结
在本章中,我们介绍了用于打包和分发应用程序的工具。 我们首先看了一个更简单的`setup.py`文件。 您研究了功能设置的属性以及这些参数如何链接到最终安装程序。 接下来,我们添加了与 NumPy 相关的代码,并添加了一些异常处理代码。 最后,我们构建了安装程序并学习了如何在 *Cheese Shop*(PyPI 网站)上上传它。 在下一章中,您将研究通过将 Python 代码的一部分转换为 Cython 来进一步加速 Python 代码的方法。
\ No newline at end of file
在本章中,我们介绍了用于打包和分发应用的工具。 我们首先看了一个更简单的`setup.py`文件。 您研究了功能设置的属性以及这些参数如何链接到最终安装程序。 接下来,我们添加了与 NumPy 相关的代码,并添加了一些异常处理代码。 最后,我们构建了安装程序并学习了如何在 *Cheese Shop*(PyPI 网站)上上传它。 在下一章中,您将研究通过将 Python 代码的一部分转换为 Cython 来进一步加速 Python 代码的方法。
\ No newline at end of file
......@@ -24,7 +24,7 @@ Cython 编程语言是 Python 的超集,用户仍然喜欢 Python 所提供的
前四个问题主要由探查器工具回答。 建议您至少学习一种分析工具。 分析工具将不在本章中介绍。 在大多数情况下,建议先尝试优化函数调用和内存使用,然后再使用低级方法,例如 Cython 或汇编语言(使用 C 衍生语言)。
一旦确定了瓶颈,并且解决了算法和逻辑的所有问题,Python 开发人员便可以进入 Cython 的世界,以提高应用程序的速度。
一旦确定了瓶颈,并且解决了算法和逻辑的所有问题,Python 开发人员便可以进入 Cython 的世界,以提高应用的速度。
# 设置 Cython
......@@ -102,7 +102,7 @@ cdefint a, b, intermediate, x
尽管在此示例代码中提高速度非常重要,但这不是您将遇到的实际代码,因此您应始终记住首先在代码上运行探查器并确定需要优化的部分。 同样,在使用 Cython 时,开发人员应考虑在使用静态类型和灵活性之间进行权衡。 使用类型会降低灵活性,有时甚至会降低可读性。
通过删除`xrange`并改用`for`循环,可以进一步改进此代码。 当您对模块的所有组件/功能都满意并且没有错误后,用户可以将这些功能/过程存储在扩展名为`.pyx`的文件中。 这是 Cython 使用的扩展名。 将此代码与您的应用程序集成的下一步是在安装文件中添加信息。
通过删除`xrange`并改用`for`循环,可以进一步改进此代码。 当您对模块的所有组件/功能都满意并且没有错误后,用户可以将这些功能/过程存储在扩展名为`.pyx`的文件中。 这是 Cython 使用的扩展名。 将此代码与您的应用集成的下一步是在安装文件中添加信息。
在这里,出于说明目的,我们将代码存储在名为`fib.pyx`的文件中,并创建了一个构建该模块的安装文件:
......@@ -124,7 +124,7 @@ cmdclass={'build_ext': build_ext}
# 多线程代码
您的应用程序可能会使用多线程代码。 由于**全局解释器锁****GIL**),Python 不适合多线程代码。 好消息是,在 Cython 中,您可以显式解锁 GIL,并使您的代码真正成为多线程。 只需在您的代码中放置一个`with nogil:`语句即可。 您以后可以在代码中使用`with gil`获取 GIL:
您的应用可能会使用多线程代码。 由于**全局解释器锁****GIL**),Python 不适合多线程代码。 好消息是,在 Cython 中,您可以显式解锁 GIL,并使您的代码真正成为多线程。 只需在您的代码中放置一个`with nogil:`语句即可。 您以后可以在代码中使用`with gil`获取 GIL:
```py
with nogil:
......
# 九、NumPy C-API 简介
NumPy 是一个通用库,旨在满足科学应用程序开发人员的大多数需求。 但是,随着应用程序的代码库和覆盖范围的增加,计算也随之增加,有时用户需要更具体的操作和优化的代码段。 我们已经展示了 NumPy 和 Python 如何具有诸如 f2py 和 Cython 之类的工具来满足这些需求。 这些工具可能是将函数重写为本地编译代码以提高速度的绝佳选择。 但是在某些情况下(利用 C 库,例如 **NAG** 编写一些分析),您可能想做一些更根本的事情,例如为您自己的库专门创建新的数据结构。 这将要求您有权访问 Python 解释器中的低级控件。 在本章中,我们将研究如何使用 Python 及其扩展名 NumPy C-API 提供的 C-API 进行此操作。 C-API 本身是一个非常广泛的主题,可能需要一本书才能完全涵盖它。 在这里,我们将提供简短的介绍和示例,以帮助您开始使用 NumPy C-API。
NumPy 是一个通用库,旨在满足科学应用开发人员的大多数需求。 但是,随着应用的代码库和覆盖范围的增加,计算也随之增加,有时用户需要更具体的操作和优化的代码段。 我们已经展示了 NumPy 和 Python 如何具有诸如 f2py 和 Cython 之类的工具来满足这些需求。 这些工具可能是将函数重写为本地编译代码以提高速度的绝佳选择。 但是在某些情况下(利用 C 库,例如 **NAG** 编写一些分析),您可能想做一些更根本的事情,例如为您自己的库专门创建新的数据结构。 这将要求您有权访问 Python 解释器中的低级控件。 在本章中,我们将研究如何使用 Python 及其扩展名 NumPy C-API 提供的 C-API 进行此操作。 C-API 本身是一个非常广泛的主题,可能需要一本书才能完全涵盖它。 在这里,我们将提供简短的介绍和示例,以帮助您开始使用 NumPy C-API。
本章将涉及的主题是:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册