1. 首页
  2. 文章

Golang协程与Python协程速度比较

aside section ._1OhGeD ·

本实验通过抓取50页诗词并做对每一页里面的a标签对应的html页面(每页40个a标签)进行抓取,然后对html做简单解析,总共就是请求50+50*40 = 2050个页面,并解析这些页面的html内容。

1.Python 速度

总耗时:31.947秒 多次试验是在32s左右

image.png
image.png
image.png

源码:

from bs4 import BeautifulSoup
import time
import aiohttp
import asyncio
async def do_task(domain, pageUrl):
 async with aiohttp.ClientSession() as session:
 async with session.request('GET', pageUrl) as resp:
 if resp.status != 200:
 raise Exception('http error, url:{} code:{}'.format(pageUrl, resp.status))
 html = await resp.read() # 可直接获取bytes
 soup = BeautifulSoup(html, 'html.parser')
 for h in soup.select('h3>a'):
 url = ''.join([domain, h.get('href')])
 async with aiohttp.ClientSession() as session:
 async with session.request('GET', url) as resp:
 if resp.status != 200:
 raise Exception('http error, url:{} code:{}'.format(pageUrl, resp.status))
 html = await resp.read() # 可直接获取bytes
 print('url:{} title:{}'.format(url, parse_text(html)))
def parse_text(html):
 soup = BeautifulSoup(html, 'html.parser')
 return str(soup.select('.shici-title')[0].get_text())
def main():
 domain = 'http://www.shicimingju.com'
 urlTemplate = domain + '/chaxun/zuozhe/9_{0}.html'
 pageNum = 50 # 读取50页诗词进行测试
 loop = asyncio.get_event_loop() # 获取事件循环
 tasks = []
 for num in range(pageNum + 1):
 tasks.append(do_task(domain, urlTemplate.format(num + 1)))
 loop.run_until_complete(asyncio.wait(tasks)) # 协程
 loop.close()
if __name__ == '__main__':
 start = time.time()
 main() # 调用方
 print('总耗时:%.3f秒' % float(time.time() - start))

2. Golang 速度

总耗时:15.366秒 多次试验基本是在15s左右,最快的几次甚至到了12s,13s,最差也是22s。

image.png
image.png

image.png

源码:

package main
import (
 "fmt"
 "github.com/PuerkitoBio/goquery"
 "strconv"
 "strings"
 "sync"
 "time"
)
func do_task(url string, domain string) {
 p, err := goquery.NewDocument(url)
 if err != nil {
 panic(err)
 } else {
 p.Find("h3").Find("a").Each(func(i int, selection *goquery.Selection) {
 href, _ := selection.Attr("href")
 link := domain + href
 h, err := goquery.NewDocument(link)
 if err != nil {
 panic(err)
 } else {
 title := h.Find(".shici-title").Text()
 fmt.Printf("url:%s title:%s \n", link, title)
 }
 })
 }
 wg.Done()
}
var wg sync.WaitGroup
func main() {
 start := time.Now().UnixNano()
 domain := "http://www.shicimingju.com"
 urlTemplate := domain + "/chaxun/zuozhe/9_{:num}.html"
 pageNum := 50
 wg.Add(50)
 for page := 1; page <= pageNum; page++ {
 url := strings.Replace(urlTemplate, "{:num}", strconv.Itoa(page), -1)
 go do_task(url, domain)
 }
 wg.Wait()
 end := time.Now().UnixNano()
 fmt.Printf("总耗时:%.3f秒 \n", float32(end - start)/1000000000)
}

3.结论

Golang的性能妥妥地要比Python,PHP好,毕竟是为并发而生的语言。

本文来自:简书

感谢作者:aside section ._1OhGeD

查看原文:Golang协程与Python协程速度比较

"go的编码转码,json" ----- 真是个硬伤,每次我都怀疑人生
#2
更多评论
拿一门静态语言跟动态语言比协程!嗯,你可以的!python还想跟go比简单呢?go的编码转码,json等各种格式转换在python都是一个函数调用搞定,你怎么不比较比较?捂脸!
#1

用户登录

没有账号?注册

今日阅读排行

    加载中

一周阅读排行

    加载中