性能问题,Python vs C

性能问题,Python vs C,python,c,python-imaging-library,Python,C,Python Imaging Library,我使用PIL进行图像处理,我尝试将彩色图像转换为灰度图像,因此我编写了一个Python函数来实现这一点,同时我知道PIL已经为此提供了一个convert函数 但是我用Python编写的版本需要大约2秒钟来完成灰度缩放,而PIL的转换几乎是瞬间完成的。所以我读了PIL代码,发现我写的算法基本相同,但是 PIL的转换是用C或C++编写的。 这就是造成性能不同的问题吗?是的,用Python和C编写相同的算法,C实现会更快。对于通常的Python解释器(称为CPython)来说,这无疑是正确的。另一个实

我使用PIL进行图像处理,我尝试将彩色图像转换为灰度图像,因此我编写了一个Python函数来实现这一点,同时我知道PIL已经为此提供了一个
convert
函数

但是我用Python编写的版本需要大约2秒钟来完成灰度缩放,而PIL的转换几乎是瞬间完成的。所以我读了PIL代码,发现我写的算法基本相同,但是 PIL的<代码>转换是用C或C++编写的。
这就是造成性能不同的问题吗?

是的,用Python和C编写相同的算法,C实现会更快。对于通常的Python解释器(称为CPython)来说,这无疑是正确的。另一个实现PyPy使用JIT,因此可以获得令人印象深刻的速度,有时速度与C实现一样快。但是在CPython下运行,Python会更慢。

是的,用Python和C编写相同的算法,C实现会更快。对于通常的Python解释器(称为CPython)来说,这无疑是正确的。另一个实现PyPy使用JIT,因此可以获得令人印象深刻的速度,有时速度与C实现一样快。但是在CPython下运行时,Python会比较慢。

如果您想进行图像处理,可以使用

OpenCV(cv2)、SimpleCV、NumPy、SciPy、Cython、Numba

OpenCV、SimpleCV和SciPy已经有许多图像处理例程

NumPy可以以c速度在阵列上执行操作

如果希望在Python中使用循环,可以使用Cython将带有静态声明的Python代码编译到外部模块中


或者您可以使用Numba进行JIT转换,它可以将python代码转换为机器二进制代码,并提供接近c的速度。

如果您想进行图像处理,可以使用

OpenCV(cv2)、SimpleCV、NumPy、SciPy、Cython、Numba

OpenCV、SimpleCV和SciPy已经有许多图像处理例程

NumPy可以以c速度在阵列上执行操作

如果希望在Python中使用循环,可以使用Cython将带有静态声明的Python代码编译到外部模块中


或者您可以使用Numba进行JIT转换,它可以将您的python代码转换为机器二进制代码,并提供接近c的速度。

c在执行速度方面比python快得多(在大多数情况下)。在这里,特别重要的是在Python中循环(迭代像素)。通常,对于CPython来说,处理器密集型例程应该用C或C++编写,如果Python是性能扩展的,则称为扩展模块,这与PIL根本没有关系,了解由虚拟机解释的语言(通常称为解释语言,有时是脚本语言)和由实际硬件解释的语言(通常称为编译语言)。C在执行速度方面比Python快得多(在大多数情况下)。在这里,特别重要的是在Python中循环(迭代像素)。通常,对于CPython来说,处理器密集型例程应该用C或C++编写,如果Python是性能扩展的,则称为扩展模块,这与PIL根本没有关系,阅读由虚拟机解释的语言(通常称为解释语言,有时是脚本语言)和由实际硬件解释的语言(通常称为编译语言)。正如@Charles在上述评论中所说,
处理器密集型例程应该用C或C++
编写,那我们为什么需要Python呢?继续做CBE中的所有工作吧,因为并不是所有程序都是处理器密集型的,即使是那些处理器密集型的程序,通常你也可以使用其他人的C代码,使用numpy或PIL之类的库,正如你所发现的那样。Python提高了程序员的生产率,这可能是一个巨大的胜利。正如@Charles在上面的评论中所说,
处理器密集型例程应该用C或C++
编写,那么我们为什么需要Python呢?继续做CBE中的所有工作吧,因为并不是所有程序都是处理器密集型的,即使是那些处理器密集型的程序,通常你也可以使用其他人的C代码,使用numpy或PIL之类的库,正如你所发现的那样。Python提高了程序员的生产率,这可能是一个巨大的胜利。