如何对Django项目执行Cythonize编译 实现性能提升与代码体积压缩
更新:
目标:
- 缩小代码体积
- 降低请求-响应模型中的延迟
- 提升代码执行速度
原始问题:
如何将所有.py文件转换为.pyx或.pyc格式?我正尝试对现有的Django项目执行Cythonize操作,该操作需要将所有.py文件转换为.pyc,我找到了可以实现该需求的简单方案,希望分享给和我有相同需求的开发者。
实现方案
1. 批量生成.pyc文件
直接使用Python内置的compileall模块即可完成全目录递归编译,无需安装额外依赖:
- 生成带版本标识、存放在
__pycache__目录的.pyc:python -m compileall . - 生成与源文件同目录、不带版本标识的.pyc(适合生产部署):
python -m compileall -b .
2. Cythonize编译为二进制扩展(性能提升更高)
无需手动将.py后缀改为.pyx,Cython原生支持直接编译.py文件,按以下步骤操作即可:
- 先安装Cython:
pip install cython - 在Django项目根目录新建
setup.py,内容如下:
from setuptools import setup from Cython.Build import cythonize import os # 配置排除不需要编译的文件,避免项目启动异常 exclude_files = [ "manage.py", "*/settings.py", "*/wsgi.py", "*/asgi.py", "*/migrations/*.py", "*/__init__.py" ] def collect_py_files(root_dir="."): py_files = [] for root, _, files in os.walk(root_dir): for file in files: if file.endswith(".py"): file_path = os.path.join(root, file) skip = False for excl_pattern in exclude_files: if os.path.normpath(file_path).endswith(os.path.normpath(excl_pattern.replace("*", ""))): skip = True break if not skip: py_files.append(file_path) return py_files setup( ext_modules=cythonize( collect_py_files(), compiler_directives={"language_level": "3", "optimize.use_switch": True} ), zip_safe=False )
- 执行编译命令:
python setup.py build_ext --inplace - 编译完成后,可删除所有.py源文件(排除列表内的文件保留)、中间生成的.c文件和build目录,剩余的.so(Linux/macOS)/.pyd(Windows)二进制文件可直接被Python加载运行,相比pyc有更高的执行效率和更小的代码体积。
注意:编译后的二进制文件和运行环境强绑定,需要在和生产环境一致的系统、Python版本下执行编译操作。
内容的提问来源于stack exchange,提问作者avvijeet
相关产品推荐
相关产品推荐

