3

我需要更高的性能来运行我的神经网络,所以我认为用 cython 构建它是个好主意。我正在构建这样的代码:

from distutils.core import setup
from Cython.Build import cythonize

setup(
    ext_modules = cythonize("my_code.pyx")
)

但它会构建我使用的外部 python 文件吗?就我而言,就像 pybrain、skimage 和 PIL。如果没有,如何强制 cython 构建它们。

4

1 回答 1

2

不,外部 python 文件不会被 cythonized 和编译,除非您专门将它们setup.py作为扩展添加到您的。据我所知,没有简单的方法可以做到这一点。

这意味着对外部文件的所有调用都将在“Python 空间”中处理,因此无法充分利用 Cython 的潜力。例如,对外部文件的所有调用都会进行类型检查,这会浪费大量时间。如果您使用 cythonize 文件cython -a yourfile.pyx并查看创建的 C 代码,您可以看到这一点。黄色越多,您的代码就越pythony 。

您有以下选择:

  1. 查找提供 Cython 或 C 级访问权限的库/包。不幸的是,使用 Cython 并为 C 库构建包装器需要大量工作才能找到好的(或根本没有)好的可能性很小。请注意,它们自己用 C 语言实现的包(例如 numpy)已经相当快了。我不知道这对您的包裹有什么影响。从我第一眼看到的来看,pybrains 似乎是纯 python。
  2. 获取您要使用的软件包的源代码并使用 Cython 自己编译它们。这可能是大量的工作,不值得花时间。
  3. 使用lineprofiler / kernprof 之类的分析器查找瓶颈(这应该始终是优化的第一步)并尝试仅对运行时瓶颈进行 cythonize。

我个人会选择选项三,因为选项一和选项二都可能需要你做很多工作,结果令人怀疑。

于 2016-07-07T14:47:54.953 回答