利用PyCharm Profile分析异步爬虫效率详解

今天比较忙,水一下

下面的代码来源于这个视频里面提到的,github 的链接为:github.com/mikeckenned…(本地下载)

第一个代码如下,就是一个普通的 for 循环爬虫。原文地址

import requests
import bs4
from colorama import Fore

def main():
 get_title_range()
 print("Done.")

def get_html(episode_number: int) -> str:
 print(Fore.YELLOW + f"Getting HTML for episode {episode_number}", flush=True)

 url = f'https://talkpython.fm/{episode_number}'
 resp = requests.get(url)
 resp.raise_for_status()

 return resp.text

def get_title(html: str, episode_number: int) -> str:
 print(Fore.CYAN + f"Getting TITLE for episode {episode_number}", flush=True)
 soup = bs4.BeautifulSoup(html, 'html.parser')
 header = soup.select_one('h1')
 if not header:
  return "MISSING"

 return header.text.strip()

def get_title_range():
 # Please keep this range pretty small to not DDoS my site. ;)
 for n in range(185, 200):
  html = get_html(n)
  title = get_title(html, n)
  print(Fore.WHITE + f"Title found: {title}", flush=True)

if __name__ == '__main__':
 main()

这段代码跑完花了37s,然后我们用 pycharm 的 profiler 工具来具体看看哪些地方比较耗时间。

点击Profile (文件名称)

之后获取到得到一个详细的函数调用关系、耗时图:

可以看到 get_html 这个方法占了96.7%的时间。这个程序的 IO 耗时达到了97%,获取 html 的时候,这段时间内程序就在那死等着。如果我们能够让他不要在那儿傻傻地等待 IO 完成,而是开始干些其他有意义的事,就能节省大量的时间。

稍微做一个计算,试用asyncio异步抓取,能将时间降低多少?

get_html这个方法耗时36.8s,一共调用了15次,说明实际上获取一个链接的 html 的时间为36.8s / 15 = 2.4s。**要是全异步的话,获取15个链接的时间还是2.4s。**然后加上get_title这个函数的耗时0.6s,所以我们估算,改进后的程序将可以用 3s 左右的时间完成,也就是性能能够提升13倍。

再看下改进后的代码。原文地址

import asyncio
from asyncio import AbstractEventLoop

import aiohttp
import requests
import bs4
from colorama import Fore

def main():
 # Create loop
 loop = asyncio.get_event_loop()
 loop.run_until_complete(get_title_range(loop))
 print("Done.")

async def get_html(episode_number: int) -> str:
 print(Fore.YELLOW + f"Getting HTML for episode {episode_number}", flush=True)

 # Make this async with aiohttp's ClientSession
 url = f'https://talkpython.fm/{episode_number}'
 # resp = await requests.get(url)
 # resp.raise_for_status()

 async with aiohttp.ClientSession() as session:
  async with session.get(url) as resp:
   resp.raise_for_status()

   html = await resp.text()
   return html

def get_title(html: str, episode_number: int) -> str:
 print(Fore.CYAN + f"Getting TITLE for episode {episode_number}", flush=True)
 soup = bs4.BeautifulSoup(html, 'html.parser')
 header = soup.select_one('h1')
 if not header:
  return "MISSING"

 return header.text.strip()

async def get_title_range(loop: AbstractEventLoop):
 # Please keep this range pretty small to not DDoS my site. ;)
 tasks = []
 for n in range(190, 200):
  tasks.append((loop.create_task(get_html(n)), n))

 for task, n in tasks:
  html = await task
  title = get_title(html, n)
  print(Fore.WHITE + f"Title found: {title}", flush=True)

if __name__ == '__main__':
 main()

同样的步骤生成profile 图:

可见现在耗时为大约3.8s,基本符合我们的预期了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

(0)

相关推荐

  • PyCharm使用教程之搭建Python开发环境

    PyCharm是JetBrains系列产品的一员,也是现在最好用的IDE.PyCharm维持了JetBrains一贯高度智能的作风,简要枚举如下: 独特的本地VCS系统 强大的重构功能 基于上下文的智能代码提示和纠错 可以与IDEA.PhpStorm等IDE共享配置文件 PyCharm社区版免费下载地址:http://www.jetbrains.com/pycharm/ PyCharm我们注册破解版下载地址:http://www.jb51.net/softs/299378.html 安装完PyC

  • pycharm 使用心得(五)断点调试

    [运行]和[调试]前的设置,详见前面的文章,helloword. 1,设置断点 在代码前面,行号的后面,鼠标单击,就可以设置断点.如下: 2,调试 断点点击那个绿色的甲虫图标(似乎甲虫已经成为debug专用图标了),进行断点调试. 点击后,会运行到第一个断点.会显示该断点之前的变量信息. 点击Step Over 或者按F8,我们继续往下运行,到下一个断点: 补充: 断点的其他操作,和功能,大家可以把鼠标移到相应的按钮上,看一下,试试便知.如下: 总结: 这就是PyCharm的断点功能,还是很简单

  • python安装教程 Pycharm安装详细教程

    python安装教程和Pycharm安装详细教程,分享给大家. 首先我们来安装python 1.首先进入网站下载:点击打开链接(或自己输入网址https://www.python.org/downloads/),进入之后如下图,选择图中红色圈中区域进行下载. 2.下载完成后如下图所示 3.双击exe文件进行安装,如下图,并按照圈中区域进行设置,切记要勾选打钩的框,然后再点击Customize installation进入到下一步: 4.对于上图中,可以通过Browse进行自定义安装路径,也可以直

  • pycharm 使用心得(七)一些实用功能介绍

    实时比较 PyCharm 对一个文件里你做的改动保持实时的跟踪,通过在编辑器的左侧栏显示一个蓝色的标记. 这一点非常方便,我之前一直是在Eclipse里面用命令"Compare against HEAD" 来比较一个文件前后的改动. 在PyCharm中,你可以对你的改动一览无余.同时,点击那个标记,会显示出之前的内容以及一个工具栏: 你可以很容易地回滚这些改动,在一个详尽的对话框中查看这些改动或是将之前的文本粘贴到剪切板上. 提交时的比较预览在Eclipse 中,当你提交改动时,会有一

  • pycharm 使用心得(二)设置字体大小

    步骤: Settings-->Editor-->Colors & Fonts-->Font 然后在size那里调整.

  • pycharm 使用心得(九)解决No Python interpreter selected的问题

    初次安装完PyCharm后,新建项目时,遇到了No Python interpreter selected的问题. 意思是说没有找到Python解释器.那我们添加Python解释器即可. Python–Preferences–Project Interpreter–Python Interpreter 点击"+"号选择系统安装的Python. 然后再返回Project Interpreter,选择刚添加的解释器. 现在就能新建项目了. 开始你的Python之旅吧.

  • pycharm 使用心得(一)安装和首次使用

    首先预览一下 PyCharm 在实际应用中的界面:(更改了PyCharm的默认风格) 安装 首先去下载最新的pycharm 2.7.3,进行安装.可以直接在官网下载. PyCharm 的激活方式: 1,推荐购买正版. 2,可以选择试用,免费试用30天. 3,网上找激活码: (下面的激活码来自互联网,仅供学习交流之用) user name: EMBRACE key:14203-120420100000107Iq75C621P7X1SFnpJDivKnX6zcwYOYaGK3euO3ehd1MiTT

  • pycharm下打开、执行并调试scrapy爬虫程序的方法

    首先得有一个Scrapy项目,我在Desktop上新建一个Scrapy的项目叫test,在Desktop目录打开命令行,键入命令:scrapy startproject test1 目录结构如下: 打开Pycharm,选择open 选择项目,ok 打开如下界面之后,按alt + 1, 打开project 面板 在test1/spiders/,文件夹下,新建一个爬虫spider.py, 注意代码中的name="dmoz".这个名字后面会用到. 在test1目录和scrapy.cfg同级目

  • Python、PyCharm安装及使用方法(Mac版)详解

    上周跟朋友喝咖啡时聊起我想学Python,她恰好也有这个打算,顺便推荐了一本书<编程小白的第1本Python入门书>,我推送到Kindle后,随手翻看了下,用语平实,简洁易懂. 之前在R语言和Python中做选择时,网上看了些别人对这两种语言的评价,也问了一些公司在使用哪种语言,后来还是决定,哪种语言有我喜欢的教材就选哪种,这样会在初始学习时多很多积极性和成就感. 这里对于Python的具体介绍就不做赘述,它的使用对象主要有:数据分析师.网站后端程序员.游戏开发者.自动化测试.自动化运维等.可

  • pycharm 使用心得(三)Hello world!

    1,新建一个项目 File --> New Project... 2,新建一个文件右键单击刚建好的helloWord项目,选择New --> Python File 3,输入文件名输入文件名,没什么好说的 4,进入编写界面PyCharm的默认编辑界面很怪,会自动生成一行 __author__ = "作者" 的头.而比较常用的文件头,如:#coding=utf-8 等,反倒没有自动生成. 输入code: print "Hello word!" 5,设置控制

随机推荐