gpt4 book ai didi

python - 将简单的 Python 模块移植到 Cython

转载 作者:太空宇宙 更新时间:2023-11-03 15:21:59 28 4
gpt4 key购买 nike

假设我有一个目录“pylib”,其中包含以下内容:

pylab/funcs.py:

def add(a, b):
return a + b

pylab/__init__.py:

from .funcs import add

然后可以执行以下操作:

$ python -c "import pylib as lib; print(lib.add(5, 6))"
11

如何才能在具有相似组织结构的 Cython 中达到相同的效果?也就是说,如果我只有一个文件,例如:

cylab.pyx:

def add(a, b):
return a + b

我可以创建一个安装脚本

设置.py:

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

extensions = [ # I will eventually be referencing C libraries
Extension('cylib', ['cylib.pyx'], libraries=[], library_dirs=[])
]

setup(
ext_modules = cythonize(extensions)
)

然后剩下的工作就以相当简单的方式进行了

$ ./setup.py build_ext --inplace
[omitted]
$ python -c "import cylib as lib; print(lib.add(5, 6))"
11

但我不清楚如何将其分解为单独的文件,也不清楚如何修改安装脚本。

最佳答案

构建包含子模块的单个 Cython 扩展实际上是不可能的。我认为最好的选择是构建大量单独的 Cython 库。

只需将所有 .py 重命名为 .pyx 即可生成一堆 Cython 扩展。结构将与以前相同。我会排除模块 __init__.py并将其保留为纯 Python(在本例中 Python 如何查找模块的规则 are a little more complicated

您希望在 setup.py 中将所有 .pyx 文件作为单独的扩展名列出:

extensions = [ # I will eventually be referencing C libraries
Extension('cylib.funcs', ['cylib/funcs.pyx'], libraries=[], library_dirs=[]),
Extension('cylib.something_else', ['cylib/something_else.pyx'], libraries=[], library_dirs=[])
]

(并且可能还告诉 setup.py 整个 cylib 目录是一个包,就像使用 distutils/setuptools 和类似的纯 Python 模块时一样。)

关于python - 将简单的 Python 模块移植到 Cython,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43458376/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com