如何使用 pybrain 等外部 python 库在 cython 中编译我的 python 代码
Posted
技术标签:
【中文标题】如何使用 pybrain 等外部 python 库在 cython 中编译我的 python 代码【英文标题】:How to compile my python code in cython with external python libs like pybrain 【发布时间】:2016-11-09 22:08:15 【问题描述】:我需要更高的性能来运行我的神经网络,所以我认为使用 cython 构建它是个好主意。我正在构建这样的代码:
from distutils.core import setup
from Cython.Build import cythonize
setup(
ext_modules = cythonize("my_code.pyx")
)
但它会构建我使用的外部 python 文件吗?就我而言,就像 pybrain、skimage 和 PIL。 如果没有,如何强制 cython 构建它们。
【问题讨论】:
Cython 肯定会加快您程序的各个方面。但是您是否首先确定了瓶颈?您可能会发现 1% 的代码导致 99% 的缓慢。 您跳入了 Cython 池的错误端。挑选一小段代码并学习如何从中获得最佳速度。例如迭代多次的小函数。阅读文档以了解哪种代码最适合。 【参考方案1】:不,外部 python 文件不会被 cythonized 和编译,除非您专门将它们添加到您的 setup.py
作为扩展名。据我所知,没有简单的方法可以做到这一点。
这意味着对外部文件的所有调用都将在“Python 空间”中处理,因此无法充分利用 Cython 的潜力。例如,对外部文件的所有调用都会进行类型检查,这会浪费大量时间。如果您使用 cython -a yourfile.pyx
对文件进行 cythonize 处理并查看创建的 C 代码,您可以看到这一点。黄色越多,您的代码就越 pythony。
您有以下选择:
-
查找提供 Cython 或 C 级访问权限的库/包。不幸的是,使用 Cython 并为 C 库构建包装器需要大量工作才能找到好的(或根本没有)好的可能性很小。请注意,它们自己用 C 语言实现的包(例如 numpy)已经相当快了。我不知道这对您的包裹有什么影响。 pybrains 乍一看似乎是纯python。
获取您要使用的软件包的源代码并使用 Cython 自行编译。这可能工作量很大,不值得花时间。
使用像 lineprofiler / kernprof 这样的分析器查找瓶颈(这应该始终是优化时的第一步)并尝试仅对运行时瓶颈进行 cythonize。
我个人会选择选项 3,因为选项 1 和 2 都可能需要您做大量的工作,结果可能会产生问题。
【讨论】:
以上是关于如何使用 pybrain 等外部 python 库在 cython 中编译我的 python 代码的主要内容,如果未能解决你的问题,请参考以下文章
训练 LSTM 神经网络以预测 pybrain、python 中的时间序列
如何在 PyBrain 中使用函数 normalize()?
如何使用 pybrain 黑盒优化训练神经网络以监督数据集?