2011-03-26 71 views
2

我得到的問題是,我有一個Python腳本,每次執行它時都會編碼大約數千個圖像,並且不佔用大部分內存和CPU。Python PIL庫性能

如何提高性能以避免I/O開銷?

該腳本每次執行時都會生成5000個縮略圖,我想知道是否可以將圖像存儲在內存中,然後將它們「刷新」到硬盤以提高性能。

您是否有一些建議來強化我的腳本的性能?

循環內的代碼片段:

im = Image.open(StringIO.StringIO(urllib.urlopen(imagen_url).read())) 
im.thumbnail((100, 50), Image.ANTIALIAS) 

if im.mode != "RGB": 
    im = im.convert("RGB") 

im.save(dir + (imagen % coche_id), "JPEG") 

大部分的時間都花在與的urlopen(),但im.save可以改善的,我認爲。

我仍然從Python開始,我想你可以幫助我改進我的代碼。

非常感謝!

pd:對不起,如果我的英文不夠好,應該是。

回答

2

它可能可以通過同時運行多個線程來利用一些I/O併發。這可能有兩個方面的幫助:

  • 更多的TCP連接==更快(雖然作爲一個好的互聯網公民有時也很重要)。
  • 您目前擁有的程序首先將遠程URL讀入內存,然後對其進行處理,然後保存到磁盤。由於有些時候您正在等待接收數據,所以CPU沒有被充分利用。在此期間,您沒有進行處理。

在這種情況下,由於它是在I/O操作釋放GIL是沒有問題的。

如果要防止立即將文件寫入磁盤,一種方法可能是關閉正在寫入的設備上的fsync(如果它當前處於打開狀態)。

0

大部分時間都花在了urlopen()上,但我認爲im.save可以改進。

這是因爲urlopen(或者更確切地說,read)比特做IO通過網絡,這將取決於可用帶寬和服務器是緩慢的。

所以,如果你想通過網絡下載5000張圖片,你可以做的事情並不多。

+0

你完全正確。 urlopen總是會使進程變慢,但我認爲如果我可以減少I/O開銷,服務器將會變得更快,因爲它可以更快地從磁盤讀取,而不會出現寫入小縮略圖的問題(大約4KB或更少每一個)。也許每次寫入10MB的圖像或者類似的東西都會更好。 – woodgate 2011-03-26 20:02:08

+0

我並不是100%肯定會讓它變得更好。 也許你可以看看aggdraw?它使某些PIL操作更快(PIL的抗混疊濾波器被稱爲超慢)。 – ojii 2011-03-26 20:27:02