0

我正在使用urllib2,cstringIO和PIL。我需要真正調整它並使其速度非常快(至少爲當前速度的一半)在python中處理來自web的圖像的最快方法?

我使用以下方式訪問和加載圖像。

imageurl = "http://bit.ly/wOqVTE" 

@log_performance 
def get_image(imageurl): 
    img_file = urllib.urlopen(imageurl) 
    data = StringIO(img_file.read()) 
    im = Image.open(data) 
    size = 128, 128 
    im.thumbnail(size, Image.ANTIALIAS) 
    return im 

然後再處理使用圖像:

@log_performance 
def process_image(image, sample_limit=10000, top=10): 
    colors = image.getcolors(sample_limit) 
    sc = sorted(colors, key=lambda x: x[0], reverse=True) 
    return sc[:top] 

這需要平均0.6秒以獲取圖像和周圍0.006秒處理。

我該如何加快獲取和加載過程?

完整的要點可以在這裏找到。 https://gist.github.com/1920167

>>>>Function: get_image, Executed:20, Avg Time:0.558275926113 
>>>>Function: process_image, Executed:20, Avg Time:0.00609920024872 

我會給任何人一半的時間增加50的賞金。

+0

嘗試分裂'get_image'最多見多少時間花費在網絡I/O,又有多少是花在了PIL。 – icktoofay 2012-02-27 00:51:08

+1

@icktoofay說什麼。你確定你不只是達到網絡限制嗎?如果這是一個服務器響應時間問題,您可以嘗試通過'multiprocessing.Pool'來分割圖像以獲得一些併發下載。 – katrielalex 2012-02-27 01:00:20

回答

2

由於它獲取的圖像花費的時間最長,爲什麼不使用線程(或Gevent)併發獲取這些圖像,將結果放入任務隊列中,並在準備就緒時進行處理。

並添加具有相同URL的圖像緩存...