首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法用for循环来提高速度?

有没有办法用for循环来提高速度?
EN

Stack Overflow用户
提问于 2021-02-18 13:24:26
回答 1查看 89关注 0票数 1

我需要发布一系列XML元素(每个调用可能会有不同的数量)。我在Python3.9.1上使用请求v2.25.1。虽然我的解决方案可以工作,但执行大约需要27秒,尽管请求模块显示完成的r.elapsed不到1秒。我已经证实的事情:

  • r.text编码问题不存在
  • 报头信息是correct
  • creating requests.Session()没有提高响应时间

当我运行邮递员时,我也看到了不到1秒的结果。我已经将这个问题隔离到我正在运行的for loop中。数据从SQL中提取,存储为变量,然后for循环处理这一过程,并在我的XML请求中运行。

我的问题是,我的下面的代码是否是最佳实践,还是有一种更“毕多尼尼亚”的方式来完成我想要完成的任务?如有任何指导,将不胜感激。

代码语言:javascript
复制
    skill_id=[]
    agent_state=[]
    agent_name=[]

    for db_users in db_results:
       skill_id.append(db_users[0])
       agent_state.append(db_users[1])
       agent_name.append(db_users[2])
    if db_users[1] == 'NOT_READY':
       try:
            cursor.execute(sqlskillgroup)
            skillgroups = []
            for sg_query_result in cursor.fetchall():
                sg = sg_query_result[0]
                skillgroups.append(sg)

    except pyodbc.Error as e:
            print("Error retreiving skill group information from database.")
            quit()

    finally:
        connect.close()
    icm_url = "https://url_of_post"
    xmlfile = open('skill_remove.xml', 'r')
    body = xmlfile.read()
    icm_header = {
           'Content-Type': 'application/xml',
           'Authorization': 'Basic Q2hhZF9NZXllckBhamcuY29tOmNpc2Nv',
           'Cookie': 'JSESSIONID=0C8456E3901DF7A3A0862E17FD50547D'
           }

    for sgid in skillgroups:
        r = requests.request("POST",icm_url, headers = icm_header,
            data = body.format(agent = str(skill_id[0]), skill_urls = '<refURL>/unifiedconfig/config/skillgroup/' + str(sgid) + '</refURL>',),
            verify = r"CAchain.pem",
            cert = (r"cert.cer", r"cert.key"),
            )

    print(r.text)
    print(r.elapsed)
EN

回答 1

Stack Overflow用户

发布于 2021-02-18 15:24:16

看起来,您正在对循环中最后一个请求所用的时间进行计时。您可以通过将r.elapsed移动到循环中并对每个请求进行求和,或者在循环中添加一个正在运行的总计并在末尾打印,从而计算出总运行时间。

代码语言:javascript
复制
total_elapsed = 0
   for sgid in skillgroups:
    r = requests.request("POST",icm_url, headers = icm_header,
            data = body.format(agent = str(skill_id[0]), skill_urls = '<refURL>/unifiedconfig/config/skillgroup/' + str(sgid) + '</refURL>',),
            verify = r"CAchain.pem",
            cert = (r"cert.cer", r"cert.key"),
            )
    total_elapsed += r.elapsed

基本异步和aiohttp实现

代码语言:javascript
复制
import asyncio
import aiohttp

async def post_request(session, url):
    async with session.post() as request: #add your request headers, certificate etc
        await request.status

async def main():
    async with aiohttp.ClientSession() as session: # use client session to auto close at the end
        tasks = []
        for url in urls:
            t = asyncio.create_task(post_request(session, url)) #create a number of tasks to run concurrently
            tasks.append(t)

        await asyncio.gather(*tasks) # wait for all tasks to finish before close the session

asyncio.run(main())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66260878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档