Cython 对进口有啥作用?

Posted

技术标签:

【中文标题】Cython 对进口有啥作用?【英文标题】:What does Cython do with imports?Cython 对进口有什么作用? 【发布时间】:2012-12-09 06:13:19 【问题描述】:

我想创建一个 Python 扩展,我真的很喜欢使用 Cython 的想法。主要是为了获得更多关于它的知识并利用速度增益(如果有的话)。我已经阅读了很多 Cython 文档,但我还不是计算机科学家,并且没有深入了解底层基础知识,因此我提出以下问题的原因:

我只是想知道,如果我在我正在开发的 Python 扩展中使用外部导入的(例如,ORM 或 SQL 库或任何其他第三方库)会发生什么?

Cython 是如何处理的?

这个导入的库/扩展是纯 Python 还是编译后的有区别吗?

处理这个问题的正确方法是什么?

谢谢。

PS。问题以粗体显示。

【问题讨论】:

【参考方案1】:

cython 的目标是与 python 兼容,即你可以对任何 python 代码进行 cythonize 并且它将像以前一样工作。目前,大部分 python 代码已经可以工作了。 Cython 还允许您优化部分代码并将其编译为更高效的 C 代码。

话虽如此,任何 python 导入都将保持默认状态。对它们的任何调用都将作为 python 命令发出。即使模块是用 C 编写的,cython 也会通过 python 绕道来调用模块的函数。如果要直接使用 C 库,则必须为它们提供 cython 绑定。 cython documentation explains how to do this。

通常,python 充当监督者并处理模块/类的范围。如果一个模块中的代码调用任何 python 函数(或访问 python 变量),python 将根据调用者的范围解析调用。如果被调用的函数恰好在第二个模块中,python 很乐意使用它。调用者只会得到结果,而不应该真正关心其他函数是否在不同的模块中。因此,关键是决定调用哪个函数的 python 作用域规则。

【讨论】:

以上是关于Cython 对进口有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

来自 cython wiki 的 Hello World 不起作用

使用 pyximport reload_support 重新加载 Cython 不起作用

利用Cython对python代码进行加密

使用 Cython 从标头导出常量

对象引用的 Cython 初始化

《Cython系列》7. Cythonnumpy以及类型化memoryview