提交 cfe1825c 编写于 作者: V varyshare

2019-09-16 22:14:41

上级 7abcee6b
......@@ -2,7 +2,7 @@
> 原文: [http://docs.cython.org/en/latest/src/quickstart/install.html](http://docs.cython.org/en/latest/src/quickstart/install.html)
许多学术性Python发行版,例如 Anaconda [[Anaconda]](#anaconda) ,Enthought Canopy [[Canopy]](#canopy) 和 Sage [[Sage]](#sage)捆绑 Cython 并且不需要设置。但请注意,如果您的发行版发布的 Cython 版本太旧,您仍然可以使用下面的说明更新 Cython。除非脚注另有说明,否则本教程中的所有内容都应与 Cython 0.11.2 及更高版本一起使用。
许多学术性Python发行版,例如 Anaconda [[Anaconda]](#anaconda) ,Enthought Canopy [[Canopy]](#canopy) 和 Sage [[Sage]](#sage)都自带有 Cython 并且不需要设置。但请注意,如果您的发行版发布的 Cython 版本太旧,您仍然可以使用下面的说明更新 Cython。除非脚注另有说明,否则本教程中的所有内容都应与 Cython 0.11.2 及更高版本一起使用。
与大多数 Python 软件不同,Cython 需要在系统上存在 C 编译器。获取 C 编译器的细节因使用的系统而异:
......
......@@ -4,8 +4,8 @@
与 Python 不同,Cython 代码必须编译。这发生在两个阶段:
> * A `.pyx`文件由 Cython 编译为`.c`文件,包含 Python 扩展模块的代码。
> * `.c`文件由 C 编译器编译为`.so`文件(或 Windows 上的`.pyd`),可直接`import`直接进入 Python 会话.Distutils 或 setuptools 负责这部分。虽然 Cython 可以在某些情况下为你调用它们。
> * `.pyx`文件由 Cython 编译为`.c`文件,它含有 Python 扩展模块的代码。
> * `.c`文件由 C 编译器编译为`.so`文件(或 Windows 上的`.pyd`),可直接被`import`引入到 一个Python会话中. Distutils 或 setuptools 负责这部分。虽然 Cython 可以在某些情况下为你调用它们。
要完全理解 Cython + distutils / setuptools 构建过程,可能需要阅读更多关于[分发 Python 模块](https://docs.python.org/3/distributing/index.html)的内容。
......@@ -13,12 +13,12 @@
> * 写一个 distutils / setuptools `setup.py`。这是正常和推荐的方式。
> * 使用 [Pyximport](../userguide/source_files_and_compilation.html#pyximport),导入 Cython `.pyx`文件就像它们是`.py`文件一样(使用 distutils 在后台编译和构建)。这种方法比编写`setup.py`更容易,但不是很灵活。因此,如果您需要某些编译选项,则需要编写`setup.py`。
> * 手动运行`cython`命令行实用程序,从`.pyx`文件生成`.c`文件,然后手动将`.c`文件编译成适合从 Python 导入的共享库或 DLL。(这些手动步骤主要用于调试和实验。)
> * 手动运行`cython`命令行工具程序来将`.pyx`文件编译生成`.c`文件,然后手动将`.c`文件编译成适合从 Python 导入的共享库或 DLL。(这些手动步骤主要用于调试和实验。)
> * 使用 [[Jupyter]](#jupyter) 笔记本或 [[Sage]](install.html#sage) 笔记本,两者都允许 Cython 代码内联。这是开始编写 Cython 代码并运行它的最简单方法。
目前,使用 distutils 或 setuptools 是构建和分发 Cython 文件的最常用方式。其他方法在参考手册的 [源文件和编译](../userguide/source_files_and_compilation.html#compilation) 部分中有更详细的描述。
## 使用 distutils 构建 Cython 模块
## 使用 distutils 构建 一个Cython 模块
想象一下文件`hello.pyx`中的一个简单的“hello world”脚本:
......@@ -28,7 +28,7 @@ def say_hello_to(name):
```
以下可能是相应的`setup.py`脚本:
以下是相应的`setup.py`脚本:
```py
from distutils.core import setup
......@@ -43,7 +43,7 @@ setup(name='Hello world app',
如果您使用 setuptools 而不是 distutils,则需要注意,运行`python setup.py install`时的默认操作是创建一个压缩的`egg`文件,当您尝试从依赖包中使用它们时,这些文件无法与`pxd`文件一起用于`pxd`文件。为防止这种情况,请在`setup()`的参数中包含`zip_safe=False`
## 使用Jupyter笔记本
## 使用Jupyter笔记本来构建
Cython 可以通过 Web 浏览器通过 Jupyter 笔记本方便地和交互式地使用。要安装 Jupyter 笔记本,例如进入 virtualenv,使用 pip:
......@@ -90,5 +90,6 @@ print(a)
对于 Sage 数学发行版的用户,Sage 笔记本允许通过在单元格顶部键入`%cython`并进行评估来透明地编辑和编译 Cython 代码。导入到运行会话中的 Cython 单元格中定义的变量和函数。
<colgroup><col class="label"><col></colgroup>
| [[Jupyter]](#id1) | [https://jupyter.org/](https://jupyter.org/) |
\ No newline at end of file
> [[Jupyter]](#id1) [https://jupyter.org/](https://jupyter.org/)
\ No newline at end of file
......@@ -2,9 +2,9 @@
> 原文: [http://docs.cython.org/en/latest/src/quickstart/cythonize.html](http://docs.cython.org/en/latest/src/quickstart/cythonize.html)
Cython 是一个 Python 编译器。这意味着它可以在不进行更改的情况下编译普通的 Python 代码(除了一些尚未支持的语言功能的一些明显例外,请参阅 [Cython 限制](../userguide/limitations.html#cython-limitations) )。但是,对于性能关键代码,添加静态类型声明通常很有用,因为它们将允许 Cython 脱离 Python 代码的动态特性并生成更简单,更快速的 C 代码 - 有时会快几个数量级。
Cython 是一个 Python 编译器。这意味着它可以在不进行更改的情况下编译普通的 Python 代码(除了一些尚未支持的语言功能的一些明显例外,请参阅 [Cython 限制](../userguide/limitations.html#cython-limitations) )。但是,对于影响性能的关键代码,添加静态类型声明通常很有用,因为它们将允许 Cython 脱离 Python 代码的动态特性并生成更简单,更快速的 C 代码 - 有时会快几个数量级。
但必须注意,类型声明可以使源代码更加冗长,从而降低可读性。因此,不鼓励在没有充分理由的情况下使用它们,例如基准测试证明它们在性能关键部分确实使代码更快。通常情况下,正确位置的一些类型会有很长的路要走。
但必须注意,类型声明可以使源代码更加冗长,从而降低可读性。因此,不鼓励在没有充分理由的情况下使用它们,例如基准测试证明它们在性能关键部分确实使代码更快。通常情况下,正确使用的一些类型会有很长的路要走。
所有 C 类型都可用于类型声明:整数和浮点类型,复数,结构,联合和指针类型。 Cython 可以在分配时自动和正确地转换类型。这还包括 Python 的任意大小整数类型,其中转换为 C 类型时溢出的值将在运行时引发 Python `OverflowError`。 (但是,在进行算术运算时,它不会检查溢出。)在这种情况下,生成的 C 代码将正确且安全地处理 C 类型的平台相关大小。
......@@ -46,13 +46,13 @@ def integrate_f(double a, double b, int N):
```
由于迭代器变量`i`是用 C 语义键入的,因此 for 循环将被编译为纯 C 代码。键入`a``s``dx`非常重要,因为它们涉及 for 循环中的算术运算;键入`b``N`会产生较小的差异,但在这种情况下,要保持一致并输入整个函数并不是一件额外的工作。
由于迭代器变量`i`是用 C 语法定义的,因此 for 循环将被编译为纯 C 代码。键入`a``s``dx`非常重要,因为它们涉及 for 循环中的算术运算;键入`b``N`会产生较小的差异,但在这种情况下,要保持一致并输入整个函数并不是一件额外需要做的工作。
这导致纯 Python 版本的速度提高了 4 倍。
## 指定函数类型
Python 函数调用可能很昂贵 - 在 Cython 中是双倍的,因为可能需要转换到 Python 对象和从 Python 对象进行调用。在上面的示例中,假设参数在 f()内部和调用它时都是 C double,但是必须围绕参数构造 Python `float`对象才能传递它。
Python 函数调用可能很昂贵 - 在 Cython 中是双倍的,因为可能需要转换到 Python 对象和从 Python 对象进行调用。在上面的示例中,假设参数在 `f()`内部和调用它时都是 C 中的double类型,但是`float`类型必须为参数构造一个 Python 对象才能传递它。
因此,Cython 提供了声明 C 风格函数的语法,即 cdef 关键字:
......@@ -72,7 +72,7 @@ cdef 的副作用是 Python 空间不再提供该函数,因为 Python 不知
## 确定所添加类型的位置
因为静态打字通常是提高速度的关键所在,所以初学者往往倾向于在视线中输入所有内容。这降低了可读性和灵活性,甚至可以降低速度(例如,通过添加不必要的类型检查,转换或缓慢的缓冲区解包)。另一方面,忘记键入关键循环变量很容易破坏性能。帮助完成此任务的两个基本工具是分析和注释。分析应该是任何优化工作的第一步,并且可以告诉您在哪里花费时间。 Cython 的注释可以告诉你为什么你的代码需要时间。
因为静态类型通常是提高速度的关键所在,所以初学者往往倾向于所见之处指定各种变量的类型。这降低了可读性和灵活性,甚至可以降低速度(例如,通过添加不必要的类型检查,转换或缓慢的缓冲区解包)。另一方面,忘记键入关键循环变量很容易破坏性能。帮助完成此任务的两个基本工具是分析和注释。分析应该是任何优化工作的第一步,并且可以告诉您在哪里花费时间。 Cython 的注释可以告诉你为什么你的代码需要时间。
使用`-a`开关到`cython`命令行程序(或跟随 Sage 笔记本的链接)会导致 Cython 代码的 HTML 报告与生成的 C 代码交错。线条根据“类型”的级别着色 - 白线转换为纯 C,而需要 Python C-API 的线条为黄色(因为它们转化为更多的 C-API 交互,因此更暗)。转换为 C 代码的行在前面有一个加号(`+`),可以单击以显示生成的代码。
......@@ -80,4 +80,5 @@ cdef 的副作用是 Python 空间不再提供该函数,因为 Python 不知
![../../_images/htmlreport.png](img/fc1e721781844a0e6d9b190578eb09fc.jpg)
请注意,Cython 根据其赋值(包括作为循环变量目标)推断出局部变量的类型,这也可以减少在任何地方显式指定类型的需要。例如,将`dx`声明为 double 类型是不必要的,就像在最后一个版本中声明`s`的类型一样(其中`f`的返回类型已知为 C double。)一个值得注意的例外然而,算术表达式中使用的是 _ 整数类型,因为 Cython 无法确保不会发生溢出(因此在需要 Python 的 bignums 时会回退到`object`)。要允许推断 C 整数类型,请将`infer_types` [指令](../userguide/source_files_and_compilation.html#compiler-directives) 设置为`True`。对于熟悉此语言功能的读者,此指令的工作类似于 C ++中的`auto`关键字。减少输入所有内容的需求可能会有很大帮助,但也可能导致意外。特别是如果一个人不熟悉 c 类型的算术表达式。这些可以在[中找到](https://www.eskimo.com/~scs/cclass/int/sx4cb.html)[的快速概述。](https://www.eskimo.com/~scs/cclass/int/sx4cb.html)_
\ No newline at end of file
请注意,Cython 根据其赋值(包括作为循环变量目标)推断出局部变量的类型,这也可以减少在任何地方显式指定类型的需要。例如,将`dx`声明为 double 类型是不必要的,就像在最后一个版本中声明`s`的类型一样(其中`f`的返回类型已知为 C 语言的double类型。)一个值得注意的例外然而,算术表达式中使用的是整数类型,因为 Cython 无法确保不会发生溢出(因此在需要 Python 的 bignums 时会回退到`object`)。要允许推断 C 整数类型,请将`infer_types` [指令](../userguide/source_files_and_compilation.html#compiler-directives) 设置为`True`。对于熟悉此语言功能的读者,此指令的工作类似于 C ++中的`auto`关键字。减少输入所有内容的需求可能会有很大帮助,但也可能导致意外。特别是如果一个人不熟悉 c 类型的算术表达式。这些可以在[中找到](https://www.eskimo.com/~scs/cclass/int/sx4cb.html)[的快速概述。](https://www.eskimo.com/~scs/cclass/int/sx4cb.html)_
......@@ -343,7 +343,7 @@ Multiple things:
通常加速比在 2x 到 1000x 之间。这取决于你调用 Python 解释器的程度。与往常一样,请记住在各地添加类型之前进行配置添加类型会降低代码的可读性,因此请谨慎使用它们。
## 使用 C ++ 的 Primes
## 使用 C ++ 语言
使用 Cython,也可以利用 C ++语言,特别是 C ++标准库的一部分可以直接从 Cython 代码导入。
......@@ -416,4 +416,4 @@ def primes(unsigned int nb_primes):
## 语言详细信息
有关 Cython 语言的更多信息,请参阅 [语言基础知识](../userguide/language_basics.html#language-basics) 。要在数值计算环境中直接使用 Cython,请参阅 [类型记忆视图](../userguide/memoryviews.html#memoryviews)
\ No newline at end of file
有关 Cython 语言的更多信息,请参阅 [语言基础知识](../userguide/language_basics.html#language-basics) 。要在数值计算环境中直接使用 Cython,请参阅 [类型内存视图](../userguide/memoryviews.html#memoryviews)
\ No newline at end of file
# 调用 C 函数
# 调用 C 函数
> 原文: [http://docs.cython.org/en/latest/src/tutorial/external.html](http://docs.cython.org/en/latest/src/tutorial/external.html)
......@@ -120,4 +120,4 @@ print(pos is not NULL)
```
请注意,稍后更改现有参数名称是向后不兼容的 API 修改,就像 Python 代码一样。因此,如果您为外部 C 或 C ++函数提供自己的声明,那么通常需要额外的努力来选择其参数的名称。
\ No newline at end of file
请注意,稍后更改现有参数名称是向后不兼容的 API 修改,就像 Python 代码一样。因此,如果您为外部 C 或 C ++函数提供自己的声明,那么通常需要额外的工作来选择其参数的名称。
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册