You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对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文件,按以下步骤操作即可:

  1. 先安装Cython:
    pip install cython
  2. 在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
)
  1. 执行编译命令:
    python setup.py build_ext --inplace
  2. 编译完成后,可删除所有.py源文件(排除列表内的文件保留)、中间生成的.c文件和build目录,剩余的.so(Linux/macOS)/.pyd(Windows)二进制文件可直接被Python加载运行,相比pyc有更高的执行效率和更小的代码体积。

注意:编译后的二进制文件和运行环境强绑定,需要在和生产环境一致的系统、Python版本下执行编译操作。


内容的提问来源于stack exchange,提问作者avvijeet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 14:36:03