Pytest启动速度过慢(执行pytest -h需11秒)的优化咨询
问题结论
这种情况完全不正常,正常场景下pytest执行pytest --version、pytest -h这类无业务逻辑关联的简单命令,耗时应该在1秒以内。
根因分析
从你提供的性能分析结果可以明确问题根源:
pytest启动阶段加载根目录conftest.py时,连带导入了segmentation.py、object_statistics.py等业务代码,你的业务代码中包含numba JIT编译逻辑(性能日志中的ufuncbuilder、compiler相关调用都是JIT编译的特征),这类编译逻辑在模块导入阶段就会执行,直接吃掉了绝大多数启动耗时。
你安装的多个pytest插件也可能带来额外的加载开销,但不是核心瓶颈。
加速方案
- 优化conftest.py导入逻辑:不要在conftest的全局作用域导入业务代码,所有业务相关的导入都挪到fixture内部、测试用例内部执行;如果必须有全局依赖,优先使用延迟导入(比如函数内部import,或者用importlib实现懒加载),避免pytest启动加载conftest时就触发业务模块的导入和JIT编译。
- 定位高开销pytest插件:执行
pytest --trace-config可以查看每个插件的加载耗时,也可以逐个禁用插件验证开销:pytest -p no:插件名 --version,比如pytest -p no:pytest-cases --version,定位到高开销插件后,可以选择替换为轻量方案,或者仅在需要用到对应功能的时候启用插件。 - 关闭开发阶段不必要的JIT编译:如果你的业务代码使用了numba这类JIT编译工具,开发阶段可以设置环境变量
NUMBA_DISABLE_JIT=1关闭JIT,仅在性能测试、正式运行场景开启,能大幅降低模块导入耗时。 - 拆分conftest.py:如果你的根目录conftest.py里存放了大量不同业务模块的fixture,可以把fixture拆分到对应测试子目录下的conftest.py中,避免pytest启动时一次性加载所有fixture的依赖。
内容的提问来源于stack exchange,提问作者gebbissimo
相关产品推荐
相关产品推荐

