我使用Python 2.7并且是Cython的新手。
背景:
我的项目中有20多个py文件,然后我发现它们中有3个是缓慢的。
所以我对这些文件使用Cython,它们现在用Cython编译并成为pyd文件而没有任何问题。 (我花了几天时间研究这个问题,寻找最佳解决方案,改进Python编码的方式,但出于性能原因仍然需要使用Cython)
除了pyd文件,在build文件夹下,还有一些文件具有相同的文件名但扩展名不同的文件,即“.c”,“。exp”,“。lib”,“。obj”和“。 pyd.manifest“
似乎项目仍在工作,性能仍然在Cython级别,即使我移动了那些文件(“。c”“。exp”,“。lib”,“。obj”和“.pyd.manifest” ) 我对编译器的那些输出文件感到困惑,不知道什么是必要的,什么不是,以及如何使用它们并对待它们。
我的setup.py:
from distutils.core import setup
from Cython.Build import cythonize
setup(
ext_modules=cythonize("myCythonFile.pyx",)
)
答案 0 :(得分:1)
所有这些文件都是临时文件。
Cython将您的每个pyx
文件(只有一个)编译为匹配.c
文件中的C代码。它还可以发出其他文件,比如HTML文件,使C代码更具可读性,但默认情况下,这就是它给你的全部,而且你没有要求任何额外的东西。
然后Cython询问你通过distutils
配置的任何C编译器 - 在你的情况下,那是MSVC(Microsoft Visual C ++,Visual Studio附带的C和C ++编译器) - 并构建一个{{1}这些.dll
文件中的/ .pyd
文件。创建的文件及其含义的完整详细信息取决于您的编译器版本,但基本上它为每个.c
文件创建.obj
文件,然后创建.c
导入库和{{ 1}}导出库以使用.lib
,以及允许将库作为程序集加载的.exp
文件。
如果编译代码中出现问题,这些文件中的一些 - 特别是.dll
和.manifest
文件 - 非常便于调试。 (Cython生成的C代码可能非常难以追踪,但原始机器代码可能更糟糕。)
所有这些文件都可以帮助您在更快的更改后进行重建。
如果您想要执行更复杂的操作,例如将其他库链接到您的库,也需要其中一些文件。
如果你没有做任何这些事情,你就不需要它们。但是也没有理由摆脱它们。 (如果要重新分发代码,可能需要构建源代码包和二进制轮,并且这两者都知道如何跳过不必要的中间文件。)