From cfe1825c66eaae34c5eb24e62b2387ee569aa35f Mon Sep 17 00:00:00 2001 From: varyshare Date: Mon, 16 Sep 2019 22:14:41 +0800 Subject: [PATCH] 2019-09-16 22:14:41 --- docs/4.md | 2 +- docs/5.md | 17 +++++++++-------- docs/6.md | 13 +++++++------ docs/8.md | 4 ++-- docs/9.md | 4 ++-- 5 files changed, 21 insertions(+), 19 deletions(-) diff --git a/docs/4.md b/docs/4.md index ef58e9a..ecb2a7c 100644 --- a/docs/4.md +++ b/docs/4.md @@ -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 编译器的细节因使用的系统而异: diff --git a/docs/5.md b/docs/5.md index f62e6c6..7cce8b9 100644 --- a/docs/5.md +++ b/docs/5.md @@ -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 单元格中定义的变量和函数。 - -| [[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 diff --git a/docs/6.md b/docs/6.md index 486aabd..0f51ccd 100644 --- a/docs/6.md +++ b/docs/6.md @@ -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)_ + diff --git a/docs/8.md b/docs/8.md index 3bed092..12998a7 100644 --- a/docs/8.md +++ b/docs/8.md @@ -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 diff --git a/docs/9.md b/docs/9.md index 2ec9231..297d07c 100644 --- a/docs/9.md +++ b/docs/9.md @@ -1,4 +1,4 @@ -# 调用 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 -- GitLab