2013-01-12 27 views
0

我用PIL做圖像處理,我試圖將彩色圖像轉換爲灰度,所以我寫了一個Python函數要做到這一點,同時我知道PIL已經提供了convert功能對此。性能問題,巨蟒對C

但我在Python寫的版本大約需要2秒完成了灰度化,而PIL的轉換幾乎瞬間。所以我讀了PIL代碼,發現我寫的算法基本相同,但 PIL的convert是用C或C++編寫的。

那麼,這是使性能不同的問題?

+2

在執行速度方面,C比Python快得多*在大多數情況下。這裏特別重要的東西就是循環(遍歷像素),這在Python中很慢。 – DanielB

+4

一般來說,對於CPython的至少處理器密集型的程序應該用C或C++,並呼籲從Python擴展模塊如果性能是一個大問題 –

+0

這與PIL沒有關係可言,閱讀有關虛擬機解釋型語言(通常稱爲解釋型語言,有時候是腳本語言)和由實際硬件解釋的語言(通常稱爲編譯語言)。 – mmgp

回答

3

是,編碼Python和C中的相同的算法,C實現的速度會更快。對於通常稱爲CPython的Python解釋器來說,這是絕對正確的。 PyPy的另一個實現使用JIT,因此可以實現令人印象深刻的速度,有時與C實現一樣快。但是在CPython下運行,Python會變慢。

+0

正如@Charles在上面的評論中所說的那樣,「處理器密集型例程應該用C或C++編寫」,那麼爲什麼我們需要Python呢?請繼續前進,並在C中完成所有工作 – Alcott

+3

因爲並非所有程序都是處理器密集型的,甚至可以使用其他人的C代碼,所以您可以使用像numpy或PIL這樣的庫,就像您發現的那樣。 Python提供了改進的程序員生產力,這可能是一個巨大的勝利。 –

+0

這很合理,;-)。 – Alcott

2

如果你想要做的圖像處理,可以使用

的OpenCV(CV2),SimpleCV,與NumPy,SciPy的,用Cython,Numba ...

OpenCV的,SimpleCV SciPy的有很多圖像處理程序已經。

NumPy可以以c速度對數組執行操作。

如果你想在Python中的循環,你可以用用Cython編譯靜態聲明Python代碼到外部模塊。

或者您可以使用Numba做JIT轉換,它可以轉換你的Python代碼轉換爲機器的二進制代碼,並會給你靠近C速度。

+0

感謝上述所有人,:-) – Alcott