Как ускорить запросы API?
Я создал следующую небольшую программу для получения телефонных номеров с помощью API Google Place, но она довольно медленная. Когда я тестирую с 6 предметами, это занимает где-то от 4.86 с до 1.99 с, и я не уверен, почему значительные изменения во времени. Я очень плохо знаком с 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))
5 ответов
Вы можете отправлять запросы параллельно. 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))
Используйте сеансы для включения постоянных HTTP-соединений (поэтому вам не нужно каждый раз устанавливать новое соединение)
Документы: требует расширенного использования - объекты сеанса
Большую часть времени не тратится на обработку вашего запроса. Время тратится на связь с сервером. Это то, что вы не можете контролировать.
Тем не менее, вы можете ускорить его с помощью распараллеливания. Создайте отдельный поток для каждого запроса в качестве начала.
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();
Затем используйте пул потоков по мере роста количества запросов, это позволит избежать накладных расходов при повторном создании потоков.
Нет необходимости выполнять многопоточность самостоятельно. grequests обеспечивает быструю замену запросов.
Это вопрос задержки между клиентом и серверами, вы не можете ничего изменить таким образом, если вы не используете расположение нескольких серверов (ближайший сервер к клиенту получает запрос) .
с точки зрения производительности вы можете построить многопоточную систему, которая может обрабатывать несколько запросов одновременно.