Python 爬虫改成 go,性能提高 5 倍?

2018-12-03 09:28:17 +08:00
 sagaxu
https://zhuanlan.zhihu.com/p/48254385
17866 次点击
所在节点    Python
107 条回复
keysona
2018-12-03 10:16:50 +08:00
go 抓取内容,python 解析入库。
myyou
2018-12-03 10:17:05 +08:00
别问问就是 python 不行,跟人是不是彩笔,是不是用的不对没有关系
lxy42
2018-12-03 10:17:47 +08:00
各位还是看了代码再发表评论吧,Python 爬虫竟然是一条一条数据同步保存到 MySQL。
https://github.com/lidingke/go_python_crawler_benchmark/blob/master/py_get.py#L20-L31

另外,把 mysql 换成 mysqlclient 速度又能快不少。
GoLand
2018-12-03 10:25:54 +08:00
现在有些人会写个 `print("hello world")` 就觉得自己掌握了 Python,自己不会用还怪语言慢,怪就算了,还到处张扬自己的愚蠢,写这文章的人是天生缺关注想要博关注?这不是在搞笑吗.........代码都经不起人 review 说个 jb。
ivechan
2018-12-03 10:28:16 +08:00
这个对比,我也是服气的。
一个框架, 一个手写调度,起码得保证代码的基本逻辑一致才有比较的意义吧?
看前面,居然还有 Python 同步保存到数据库这种操作。

多说一句,Python 是性能差,那也得看场景啊,像(大多数)爬虫都是 I/O 密集型的任务,Python 毫无疑问可以胜任。
Vegetable
2018-12-03 10:31:38 +08:00
这对比好蛋疼...玛莎拉蒂能跑三百,我有必要买吗?
ipwx
2018-12-03 10:32:03 +08:00
@lxy42 单核带锁用 MySQL 确实是巨大黑点。

但是话说回来,如果你用很 advanced 的技术优化了 Python 程序(我倒也是想到了很多方案,不过没做过),那么 Python 唯一一条远好于 Go 的优势、写起来容易,不是不成立了吗?就算你作为资深 Python 程序员能够优化到这种程度,但是那也只是和 Go 平起平坐而已吧。。。

利益相关:不会 Go,Python 老手吧。。
www5070504
2018-12-03 10:33:32 +08:00
... 不知道说啥好 这种 io 任务 时间大多浪费在 io 等待上 谈什么语言性能 在搞笑吧
NaVient
2018-12-03 10:34:57 +08:00
难道你们都没看到源码里 爬一条就对数据库进行 IO 的神操作吗?
xpresslink
2018-12-03 10:35:18 +08:00
最重要的问题是:
爬虫的最大痛点不是速度,而是突破反爬。
其次的痛点,50%以上的爬虫任务是一次性的。
另外不断尝试方案和调试是爬虫开发花费的主要精力。
最后是爬虫相关的库和生态丰富程度是必然要考虑的。


从这些点上来说作为不单是 Go,所有静态语言的来写爬虫是相对比较难受的。动态语言 Python 几乎就是爬虫的同义词,这不是偶然的。
est
2018-12-03 10:41:23 +08:00
把 scrapy 按在地上揍了一顿。不过瘾,怎么办?把 python 放进标题里。
wwg1994
2018-12-03 10:45:12 +08:00
@est 6666666
nuansediao
2018-12-03 10:46:41 +08:00
才快 5 倍,算不上吊打。。。也不够唬人,至少提高个几十倍的吧。
wangxiaoaer
2018-12-03 10:46:58 +08:00
说实在的,感觉这种评价参考意义并不大,scrapy 是一个大的爬虫框架,文中的 go 应用算是一个定向爬虫,功能复杂性没法比。如果不基于 scrapy,和 go 一样重写一个定向抓取的应用,相互比对,才有意义吧。
lxy42
2018-12-03 10:47:02 +08:00
@ipwx #27 过早的优化是万恶之源。如果项目一开始就对性能(实时性)有非常高的要求,那么 Python 确实不是首选。如果一开始对性能没有很高的要求,选择 Python 无疑可以提高开发速度,后期遇到性能问题,也是可以通过 C 扩展等其它手段去优化。
clino
2018-12-03 10:47:21 +08:00
文章作者看到 11 分 和 45 秒 这种级别的差异就没有怀疑一下自己的代码写法吗?
何况这又不是 CPU 密集型的
kaohaonan6666
2018-12-03 10:55:28 +08:00
IO 密集型 你用 c 写 提高幅度也不大
locoz
2018-12-03 10:57:21 +08:00
不存在的,真的写起来的时候这种简单网站的简单需求根本不需要用框架,requests+多进程或者 asyncio+aiohttp 怼就完事了,整个代码写下来最多就十几行。
跑起来之后大部分时间都在等待网络 io,这需求又没有要对数据做预处理,速度根本差不了多少,所以开发时间和爬的时间加起来还是 Python 比较快😂😂
xpresslink
2018-12-03 11:04:32 +08:00
@nuansediao 当年有个人对比了 C 和 Python 写的空循环性能,得到了比这个厉害的结论。
hpeng
2018-12-03 11:10:26 +08:00
打个比喻,约等于用 py 写睡眠排序,跟用 go 写快排,然后说吊打…

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/513689

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX