如何加快API请求速度?

问题描述 投票:0回答:6

我构建了以下小程序,用于使用 google 的 place api 获取电话号码,但速度相当慢。当我测试 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))
python api
6个回答
22
投票

您可能想并行发送请求。 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))

16
投票

使用会话启用持久 HTTP 连接(这样您就不必每次都建立新连接)

文档:请求高级用法 - 会话对象


6
投票

大部分时间都没有花在计算您的请求上。时间花在与服务器的通信上。这是你无法控制的事情。

但是,您也许可以使用并行化来加快速度。为每个请求创建一个单独的线程作为开始。

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();

然后随着请求数量的增长使用线程池,这将避免重复创建线程的开销。


3
投票

不需要自己做多线程。 grequests 提供了对请求的快速替代。


1
投票

这是客户端和服务器之间的延迟问题,除非您使用多个服务器位置(靠近客户端的服务器正在获取请求),否则您无法以这种方式更改任何内容。

在性能方面,您可以构建一个可以同时处理多个请求的多线程系统。


0
投票

我会考虑使用requests.session documentation,在某些情况下它可以将处理速度提高数倍。

类似这样的东西(基于headpost中提供的代码):

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

start_time = time.time() #timer
searchTerms = searchTerms.split(',')

with requests.Session() as s:
    for i in searchTerms:
        r1 = s.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 = s.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))
© www.soinside.com 2019 - 2024. All rights reserved.