2015-12-29 78 views
3

我已經構建了以下使用谷歌的地方api獲取電話號碼的小程序,但它很慢。當我測試6個項目時,它需要從4.86s到1.99s的任何地方,我不確定爲什麼會發生重大變化。我對API很陌生,所以我甚至不確定哪些事情可以/不能加快,哪些事情留給服務於API的Web服務器,以及我可以改變自己。如何加快API請求?

import requests,json,time 
searchTerms = input("input places separated by comma") 

start_time = time.time() #timer 
searchTerms = searchTerms.split(',') 
for i in searchTerms: 
    r1 = requests.get('https://maps.googleapis.com/maps/api/place/textsearch/json?query='+ i +'&key=MY_KEY') 
    a = r1.json() 
    pid = a['results'][0]['place_id'] 
    r2 = requests.get('https://maps.googleapis.com/maps/api/place/details/json?placeid='+pid+'&key=MY_KEY') 
    b = r2.json() 
    phone = b['result']['formatted_phone_number'] 
    name = b['result']['name'] 
    website = b['result']['website'] 
    print(phone+' '+name+' '+website) 

print("--- %s seconds ---" % (time.time() - start_time)) 
+0

我認爲你必須在這裏考慮各種因素的時間。首先,您的程序從上述URL中檢索信息所花費的時間(這將受Internet速度和Web服務器發送響應所花費的時間的影響)+ python分析該信息所用的時間。我建議分別計算這兩次,看看哪個時間需要更長的時間,以及有多少變化.. –

+0

請記住,在某些時候,你會打穀歌地圖的API速率限制;) –

回答

3

您可能想要並行發送請求。 Python提供的multiprocessing模塊適合這樣的任務。

示例代碼:

from multiprocessing import Pool 

def get_data(i): 
    r1 = requests.get('https://maps.googleapis.com/maps/api/place/textsearch/json?query='+ i +'&key=MY_KEY') 
    a = r1.json() 
    pid = a['results'][0]['place_id'] 
    r2 = requests.get('https://maps.googleapis.com/maps/api/place/details/json?placeid='+pid+'&key=MY_KEY') 
    b = r2.json() 
    phone = b['result']['formatted_phone_number'] 
    name = b['result']['name'] 
    website = b['result']['website'] 
    return ' '.join((phone, name, website)) 

if __name__ == '__main__': 
    terms = input("input places separated by comma").split(",") 
    with Pool(5) as p: 
     print(p.map(get_data, terms)) 
+0

這太棒了!你能幫我理解一下'if __name__ =='__main __':'部分,以便將來可以使用這些知識嗎? –

+1

[if __name__ =='__main __「:'do?](http://stackoverflow.com/questions/419163/what-does-if-name-main-do)。 –

+0

我的意思是不問,什麼都包含在if中。像Pool(5)和p.map一樣 –

0

大部分時間都沒有花在計算您的請求上。時間花在與服務器通信上。這是你無法控制的事情。

但是,您可能可以使用並行化加速它。作爲開始,爲每個請求創建一個單獨的線程。

from threading import Thread 

def request_search_terms(*args): 
    #your logic for a request goes here 
    pass 

#... 

threads = [] 
for st in searchTerms: 
    threads.append (Thread (target=request_search_terms, args=(st,))) 
    threads[-1].start() 

for t in threads: 
    t.join(); 

然後使用線程池作爲請求數增長,這將避免重複線程創建的開銷。

0

它是客戶端和服務器之間的延遲問題,除非使用多個服務器位置(近端服務器到客戶端正在獲取請求),否則不能以這種方式更改任何內容。

就性能而言,您可以構建一個可同時處理多個請求的多目標系統。