2015-12-29 2 views
3

Я построил следующую небольшую программу для получения телефонных номеров с использованием google-сайта api, но это довольно медленно. Когда я тестирую 6 предметов, это занимает от 4,88 до 1,99, и я не уверен, почему произошли значительные изменения во времени. Я очень новичок в API, поэтому я даже не уверен, какие вещи могут/не могут быть ускорены, какие вещи остались на веб-сервере, обслуживающем API, и что я могу изменить сам.Как ускорить запросы 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 (на это будет влиять скорость интернета и время, затраченное веб-сервером на отправку ответа) + время, затрачиваемое python для анализа этой информации. Я бы предложил рассчитать эти два раза отдельно и посмотреть, какое время занимает больше времени и сколько изменений существует. –

+0

имейте в виду, что в какой-то момент вы попадете в пределы ограничений API для карт Google;) –

ответ

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

вопрос о задержке между клиентом и серверами, вы ничего не можете изменить таким образом, если вы не используете несколько серверов (ближайший сервер к клиенту получает запрос).

С точки зрения производительности вы можете создать систему мультиотверждения, которая может одновременно передавать несколько запросов.

Смежные вопросы