【问题标题】:What are the multiple output files from Cython for?Cython 的多个输出文件有什么用?
【发布时间】:2018-06-19 04:45:46
【问题描述】:

我正在使用 Python 2.7,并且是 Cython 的新手。

背景:

我的项目中有 20 多个 py 文件,然后我发现其中 3 个文件运行缓慢。

所以我对这些文件使用 Cython,它们现在用 Cython 编译并成为 pyd 文件,没有任何问题。 (我花了几天时间调查问题,寻找最佳解决方案,改进 Python 编码方式,但出于性能原因,我仍然必须使用 Cython)

除了pyd文件,build文件夹下还有几个文件名相同但扩展名不同的文件,分别是“.c”、“.exp”、“.lib”、“.obj”和“。 pyd.manifest"

即使我将这些文件(“.c”、“.exp”、“.lib”、“.obj”和“.pyd.manifest” ) 我对编译器的那些输出文件感到困惑,不知道什么是必要的,什么不是,以及我应该如何使用它们和处理它们。

我的 setup.py:

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

setup(
    ext_modules=cythonize("myCythonFile.pyx",)
)

【问题讨论】:

  • 这在 Cython 文档中有解释,但这些都是 Cython 和 C 编译器生成的中间文件。如果你去掉它们,模块仍然可以工作,但是如果你改变一些东西,重建可能需要更长的时间,如果你需要调试东西,你可能没有任何可用的 C 级调试信息,你可能无法构建需要与此共享代码的任何其他模块。如果你不关心这些,那不是问题。如果您想更好地理解,您需要阅读文档,然后针对您没有得到的任何部分提出更具体的问题。
  • 同时,你的第二个问题是完全不同的问题,所以分开问吧。
  • 谢谢,为了清楚起见,我删除了第二个问题
  • 通常我只在 UAT 之后部署 pyc 文件。关于你的“调试东西”,如果我想保持类似级别的回溯,我是否也应该部署 build/tmp.win32-2.7/Release 下的文件?
  • 如果是这样,我应该如何根据这些目录的层次结构进行部署?

标签: python python-2.7 cython cythonize


【解决方案1】:

所有这些文件都是临时文件。

Cython 将您的每个 pyx 文件(您只有一个)编译为 C 代码以匹配 .c 文件。它还可以发出其他文件,例如 HTML 文件,以使 C 代码更具可读性,但默认情况下,这就是它为您提供的全部内容,您不需要任何额外的内容。

然后,Cython 会询问您通过 distutils 配置的任何 C 编译器(在您的情况下是 MSVC(Microsoft Visual C++,Visual Studio 附带的 C 和 C++ 编译器))并构建 .dll/@987654325 @ 文件中的那些 .c 文件。创建的文件及其含义的完整详细信息取决于您的编译器版本,但基本上它为每个 .c 文件创建一个 .obj 文件,然后是 .lib 导入库和 .exp 导出库你的.dll 和一个.manifest 文件,它允许将库作为程序集加载。

其中一些文件——尤其是.c.obj 文件——在编译代码出现问题时非常便于调试。 (Cython 生成的 C 代码可能很难追踪,但原始机器代码可能更糟。)

所有这些文件都有助于在小幅改动后更快地进行重建。

如果您想要执行更复杂的操作(例如将其他库链接到您的库),也需要其中一些文件。

如果你不做任何这些事情,你就不需要它们。但也没有理由摆脱它们。 (如果你想重新分发你的代码,你可能会构建一个源包和一个二进制轮,它们都知道如何跳过不必要的中间文件。)

【讨论】:

  • 非常感谢,我现在明白了很多!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多