当前位置: 首页 > 知识库问答 >
问题:

如何加速API请求?

徐俊楚
2023-03-14

我已经构建了以下使用google的place api获取电话号码的小程序,但速度非常慢。当我测试6个项目时,它需要4.86秒到1.99秒,我不知道为什么时间会发生重大变化。我对API非常陌生,所以我甚至不确定哪些事情可以/不能加快,哪些事情留给为API提供服务的Web服务器处理,以及我自己可以改变什么。

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

共有3个答案

居焱
2023-03-14

大多数时间并没有花在计算您的请求上。该时间用于与服务器通信。这是一件你无法控制的事情。

然而,您可以使用并行化来加速它。为每个请求创建一个单独的线程作为开始。

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

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

薛扬
2023-03-14

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

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

段干麒
2023-03-14

您可能希望并行发送请求。Python提供了适合此类任务的多重处理模块。

示例代码:

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))
 类似资料:
  • 我正在开发一个Android游戏,使用Eclipse中的libGDX。我想加快我的场景(跑步机),每当一个球员得了10分。跑步机的初始速度等于0,每10分累加5。当角色掉出屏幕时,玩家就输掉了游戏。有人知道怎么做吗?

  • 我有一个在数据库上运行查询的API。由于查询执行时间可能很长,比如3分钟到10分钟,我的负载平衡器返回“上游请求超时”,但我可以看到查询已提交到数据源,但对最终用户来说,它显示了错误的消息。如何应对这种情况? 我的职能

  • 我曾经用dplyr来实现我的数据争论,但是有些计算是“缓慢的”。特别是分组子集,我读到当有很多组时,dplyr很慢,基于这个基准data.table可能更快,所以我开始学习data.table. 下面是如何用250k行和大约230k组再现接近真实数据的东西。我想按id1,id2分组,并为每个组设置具有的行。 我找不到按数据分组的直接方法。所以我问了这个问题:用数据按组过滤行。桌子 我们建议我使用。

  • 我正在使用谷歌地图api获取城市之间的距离,获取这些距离后,我想将它们存储在数组中。但是谷歌api不允许无延迟请求。我如何添加延迟。或者有没有其他方法可以获得驾驶距离。这是代码 以上代码在没有循环的情况下运行良好。

  • 我正在使用IMU(3轴加速度计、3轴陀螺仪、3轴磁力计),我想从加速度计数据中获取线性加速度。我知道传感器融合和使用陀螺仪数据(并获取方向)获取重力矢量的能力,从而消除其对相应轴的影响。 我走在正确的道路上吗?如果可以的话,你能帮忙吗?