Pypy JIT即使只运行一次脚本也能加速吗?

2 投票
2 回答
665 浏览
提问于 2025-04-17 08:30

我有一个脚本,它会加载几百张图片,调整它们的大小,然后把它们合成一张更大的图片。

每次运行的时候,使用的图片集都不一样:

python myscript.py imageFolder/

在虚拟环境中用Pypy运行这个脚本,速度并没有明显的提升(所有的运行时间大约都是8秒,使用mprofile时,pypy版本在PIL.resize这部分花的时间更多,而在初始化包时花的时间更少)。

这是因为JIT(即时编译)只对长时间运行的程序有好处吗?

如果是这样的话,我可以把这个脚本转换成一个守护进程(但我担心会有内存泄漏的问题)。

2 个回答

1

在处理图像时,你的脚本大部分处理时间可能都花在了PIL的图像处理功能上。

这些功能是用本地代码写的,已经经过优化,运行速度非常快——所以把Python的控制部分(比如说打开哪些图像的代码,想想文件名大概只有10-20个字节,而每张图像的内容至少有10000个字节)移动到其他地方,效果不会太明显。

如果你想要更快的处理速度,别考虑使用pypy——不过如果你的机器是多核的,可以尝试通过multiprocess模块来让代码并行运行。

10

根据你的描述,PIL.resize() 这个操作是主要的部分。这个函数是用C语言写的,而不是用Python写的。所以,我怀疑你能否指望PyPy能对你的脚本有太大的帮助。

如果你想加快速度,可以考虑在多个核心上同时加载和调整图像大小。我一般不推荐在Python中使用线程,通常会建议使用 multiprocessing 模块。不过,对于这个特定的任务,多个线程可能实际上更合适。

撰写回答