我正在使用 PIL 进行图像处理,并且尝试将彩色图像转换为灰度图像,因此我编写了一个 Python 函数来执行此操作,同时我知道 PIL 已经convert
为此提供了一个函数。
但是我用 Python 编写的版本大约需要 2 秒才能完成灰度,而 PIL 的转换几乎是即时的。所以我阅读了 PIL 代码,发现我编写的算法几乎相同,但 PILconvert
是用 C 或 C++ 编写的。
那么这是导致性能不同的问题吗?
我正在使用 PIL 进行图像处理,并且尝试将彩色图像转换为灰度图像,因此我编写了一个 Python 函数来执行此操作,同时我知道 PIL 已经convert
为此提供了一个函数。
但是我用 Python 编写的版本大约需要 2 秒才能完成灰度,而 PIL 的转换几乎是即时的。所以我阅读了 PIL 代码,发现我编写的算法几乎相同,但 PILconvert
是用 C 或 C++ 编写的。
那么这是导致性能不同的问题吗?
是的,用 Python 和 C 编写相同的算法,C 实现会更快。对于通常称为 CPython 的 Python 解释器来说,这绝对是正确的。另一个实现 PyPy 使用 JIT,因此可以实现令人印象深刻的速度,有时与 C 实现一样快。但是在CPython下运行,Python会比较慢。
如果要进行图像处理,可以使用
OpenCV(cv2)、SimpleCV、NumPy、SciPy、Cython、Numba ...
OpenCV、SimpleCV SciPy 已经有很多图像处理程序。
NumPy 可以以 c 速度对数组进行操作。
如果您想要 Python 中的循环,您可以使用 Cython 将带有静态声明的 Python 代码编译到外部模块中。
或者你可以使用 Numba 进行 JIT 转换,它可以将你的 python 代码转换为机器二进制代码,并且会给你接近 c 的速度。