【问题标题】:Question About Loop Optimization and Speed关于循环优化和速度的问题
【发布时间】:2022-01-26 17:08:12
【问题描述】:

这是我的代码的要点:

while (int(price) > targetPrice):

    try:
        details = requests.get(url, headers=headers).text
        var1 = (int)(re.search('desired-string(\d+)', details).group(1))
        var2 = (int)(re.search('desired-string(\d+)', details).group(1))
        var3 = (int)(re.search('desired-string(\d+)', details).group(1))    
    except (AttributeError, ValueError):
        print('Error')

基本上,我有一个循环不断地获取网页并抓取所需的数据片段。我遇到的问题是我需要这个循环尽可能快地运行。循环迭代一次平均需要 0.33 秒,我想尽可能地降低这个数字。我获取的信息时常更改,一旦发生更改,我需要立即获取。

我发现需要这么长时间的原因是由于我提出的要求。当我只需要大约 5 行在 HTML 中的同一位置时,就会出现很多 HTML。有没有办法让请求获取 HTML 的特定行并忽略我不需要的所有内容?

提取的 HTML 来自此页面:https://www.roblox.com/catalog/6803405665/Gucci-Dionysus-Bag

多线程并不是我真正追求的,因为目标是尝试让循环尽可能快地迭代。据我所知和测试,多线程只允许循环异步运行,但每次迭代仍会以 0.33 秒的速度运行。

如果有的话,我认为这是一个优化问题。任何援助将不胜感激。如果需要任何进一步的信息,请告诉我,我会提供。

【问题讨论】:

  • 您可能希望使用 re.compile 预编译模式以保存在每个循环中完成的操作。但是,您的代码发出了一个网络请求,这可能比其他任何东西都慢至少一个数量级,并且无法优化。
  • “很多”数据是多少?服务器决定发送什么,因此除非您正在处理一个允许您控制通过请求参数接收哪些特定 HTML 行的服务器,否则您无法选择作为响应的一部分发送的内容。我推测这是导致大部分速度下降的请求,但如果不分析您的代码,我无法确定。
  • 我想“很多”数据是模糊的,我会编辑它并发布我获取的 HTML,以便做出个人判断。关于编译,我真的没有太多经验,如果数据经常变化,这仍然是一个选择吗?
  • 好的。每次迭代单独提出请求需要多少时间?
  • 平均时间大致相同,为 0.33 - 0.36 秒

标签: python optimization python-requests


【解决方案1】:

我会尝试的第一件事是使用 requests.Session 根据文档https://2.python-requests.org/en/master/user/advanced/#session-objects:

Session 对象允许您跨请求保留某些参数。它 > 还在 Session 实例发出的所有请求中保留 cookie,并且 > 将使用 urllib3 的连接池。因此,如果您向>同一主机发出多个请求,则底层 TCP 连接将被重用,这会导致 >显着提高性能(请参阅 HTTP 持久连接)。

在你的while循环之外实例化会话:

s = requests.Session()
while (int(price) > targetPrice):

    try:
        details = s.get(url, headers=headers).text
        var1 = (int)(re.search('desired-string(\d+)', details).group(1))
        var2 = (int)(re.search('desired-string(\d+)', details).group(1))
        var3 = (int)(re.search('desired-string(\d+)', details).group(1))    
    except (AttributeError, ValueError):
        print('Error')

如果这还不够,可能会转到异步请求https://pypi.org/project/aiohttp/

【讨论】:

  • 这实际上确实减少了循环迭代时间。平均值从大约 0.33 秒变为 0.25 秒。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2020-01-19
  • 2020-01-26
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 2018-10-29
  • 1970-01-01
  • 2011-07-04
相关资源
最近更新 更多