如何加快API请求?

时间:2015-12-29 14:01:50

标签: python api

我已经构建了以下用于使用google的地方api获取电话号码的小程序,但它很慢。当我用6个项目进行测试时,它需要从4.86秒到1.99秒,我不确定为什么会发生重大变化。我对API很新,所以我甚至不确定哪些东西能够/不能加速,哪些东西留给了服务API的网络服务器以及我可以改变自己的东西。

[prompt] $procs = Get-WMIObject win32_process  
[prompt] $procs[0] | Get-Member

5 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

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

文档:Requests Advanced Usage - Session Objects

答案 2 :(得分: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();

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

您无需自己进行多线程处理。 grequests为请求提供快速替代。