请选择 进入手机版|继续访问电脑版
发新帖

求从 Python 转 Go 的实际经验分享

[复制链接]
9354 31

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
社区里有没有 从 Python 转 Go 的实际业务开发经验的人,分享下转的过程中 转的原因,工程效率对比,遇到的各种坑, 最后的收益 等等的

举报 使用道具

回复

精彩评论31

lianggaofeng04  新手上路  发表于 2018-1-31 14:26:55 | 显示全部楼层
顺手再贴个 老招聘贴( Python & Golang ) https://www.v2ex.com/t/333691

举报 使用道具

回复
luckyray  新手上路  发表于 2018-1-31 14:30:07 | 显示全部楼层
话题太大

举报 使用道具

回复
muninn  新手上路  发表于 2018-1-31 14:38:08 | 显示全部楼层
转呗。 不考虑轮子,开发效率差不多的。但性能可好多了。

我转了之后都是优先用 go, 有个别的为了用轮子用的 python。

反正在微服务架构下语言随便用。

最大的问题是前两天在 python 里写出来个大括号,检查了 10 分钟硬是没想通为啥语法错误。

举报 使用道具

回复
wellsc  注册会员  发表于 2018-1-31 14:39:34 | 显示全部楼层
正在考虑转,Mark 一个

举报 使用道具

回复
xiaoshenke  新手上路  发表于 2018-1-31 14:41:43 | 显示全部楼层
有什么场景需要转 go ?区块链开发?

举报 使用道具

回复
siteshen  注册会员  发表于 2018-1-31 14:42:36 | 显示全部楼层
原因:看好 go 的发展,原来两年多的 python 代码,业务逻辑面目全非了。
效率:
    15 年早期两个人一个多月使用 clojure 初始化项目 1.5m x 2p
    15 年末 clojure 不好招人,一个人用 python 花了一个多月时间重写 clojure 的项目,开始招 python 工程师。1.5m x 1p
    17 年中两个人用了两个月时间用 go 重写了 python 的项目 2m x 2p

我个人看来,开发效率方面差不多。go 花的时间更长,一方面业务更复杂,另一方面还要造些轮子。

坑?不记得了,该填的都填了,填不了的都将就了。
收益?换静态语言后,感觉编译过了事情就完成一大半了。

举报 使用道具

回复
owenliang  新手上路  发表于 2018-1-31 14:43:15 | 显示全部楼层
楼主,你得先说你做什么领域

举报 使用道具

回复
navigaid  新手上路  发表于 2018-1-31 14:54:43 | 显示全部楼层
https://www.slideshare.net/wuvist1/python-to-go

举报 使用道具

回复
taozle  新手上路  发表于 2018-1-31 15:06:03 | 显示全部楼层
饿了吗不是在转 java 吗?
用 go 重构 python 代码一般来说资源消耗大概能降低到原来的 1/5 到 1/10,并且延迟大大降低,开发效率熟悉之后其实相差不了多少

举报 使用道具

回复
tulongtou  新手上路  发表于 2018-1-31 15:06:45 | 显示全部楼层
以前写爬虫用 python,后来开始试着用 go,刚开始各种不顺手,各种理由回到 python,用久了 go 也一样写,并不比 python 麻烦,而且很大一个好处是不用配置运行环境,可以交叉编译,想放到哪里跑,直接编译二进制文件扔过去就跑

举报 使用道具

回复
shidenggui  新手上路  发表于 2018-1-31 15:11:15 | 显示全部楼层
我以前在一家做图像分类的公司完整经历过 Python 转 Go。
最开始我们的业务架构是 all Python,api 服务使用 flask + celery + redis + mongdb + 基于 thrift 的 C++服务, 处理简单的图片分类。
转的原因:后面来了一个业务需求,对 api 的响应速度和 qps 都有要求,基本上是几千 qps 每秒。因为本身的业务逻辑比较简单,所以我们 profiling 了下,发现瓶颈在 Python 本身。我以前用过 Golang,所以基于 Gin 框架实现了一个简单的业务逻辑进行压测,发现性能比 Python 好很多,达到我们的预期。

## 工程效率对比:
* 一个是响应时间快了不少,Python 的话能优化的空间有限,而且效果也不是很理想
* 单机支持的 qps   提升很多,不需要增加线上的机器就可以满足新需求
上面这两个提升基本是 5 倍左右吧,具体记不清了

然后我们基于 Golang 实现了原来的鉴别服务,达成了项目需要。

## 遇到的坑:

* 包生态还不完善。我们重度依赖 Celery,Golang 当时没有类似 Python Celery 这个库,所以只能参考 Celery 的原理实现一个类似的。还有一些基于 Pandas 的代码还是保留 Python 版本。
* Golang 的包版本管理以及下载比较麻烦,本地有代理还好,线上部署如果是实时拉代码的话很麻烦。后来我们把需要的库都本地打包到 docker 镜像里作为 base image。

## 其他收益

相比 Python 好的地方
* Golang 的类型检查和基于防御性编程的错误处理方式,减少了很多 Bug 发生率,不像 Python,有时候一个错误会传递很深
* Golang 的 goroutine 加 channel 在实现一些跟并发相关的控制逻辑时非常简洁
* 对重构友好,完善的语法补全、定义跳转。我们的 Golang 项目都是用 vim 写的,基于 vim-go 插件,基本可以达到跟 ide 一样的效果,用 Python 的话基本不敢想象比较大的项目离开了 Pycharm 后面会变成怎么样
* 编译速度快,支持跨平台编译,部署方便,内存占用低,长时间运行非常稳定
* 自带 profiling 工具,性能分析方便

跟 Python 比不足的地方
* Golang 开发效率的降低,主要是内置库没有 Python 丰富加上需要类型的缘故,会稍微繁琐一点。目测开发相同功能应该是降低到原来的 1/2 或者 1/3。但是如果算上 Golang 带来的 Bug 提早发现减少的后续开发维护工作的话,我感觉并没降低太多。毕竟修 Bug 是个很蛋疼的事情,尤其是 Python 这种
* 测试麻烦。Python 有 mock,写测试还是比较舒服的。但是 Golang 的话,如果没有一开始就基于 interface 去思考这个代码怎么测试的话,后续写测试很蛋疼

零零碎碎就记得这些了,可能有些随着时间流逝外加 Golang 生态圈的变化已经失效了,列在这里仅供楼主参考

举报 使用道具

回复
drackzy  新手上路  发表于 2018-1-31 15:11:32 | 显示全部楼层
Ruby 也想转 go 了,工作机会多不少

举报 使用道具

回复
shidenggui  新手上路  发表于 2018-1-31 15:13:12 | 显示全部楼层
漏了一条,自带 go fmt,省心省力,再也不用纠结代码格式的问题了

举报 使用道具

回复
strahe  新手上路  发表于 2018-1-31 15:14:06 | 显示全部楼层
感觉没有什么转不转的, 语言就是工具而已, 学会一个就多会一个.

我在公司实际 python 和 go 都会使用, 主要还是看项目用什么合适,

给我个人最大的感受就是,go 的性能还是有明显的优势, 编译成一个二进制文件也很方便,另一个就是异常处理, 我觉得 go 的处理方式比 python 好, 其他就是一些什么库啊什么的, 其他人肯定会补充的。

举报 使用道具

回复
blless  新手上路  发表于 2018-1-31 15:17:54 | 显示全部楼层
我们一开始用 python 只是觉得 python 对 windows 下开发友好而已,后来发现很多功能 windows 下也是不完整的。go 我觉得目前算是跨平台最友好的语言了

举报 使用道具

回复
l1093178  新手上路  发表于 2018-1-31 15:25:15 | 显示全部楼层
之前写 Python,最近一个项目在用 golang
先说优点
1. 性能比 Python 好挺多,基本上写出来就能有不错的的性能
2. Goroutine 和 channel 很好用,
3. 默认静态链接,部署方便
4. 静态类型,重构比 Python 安全很多
5. gofmt 减少了很多关于代码风格的争论
缺点:
1. 表达力有点弱:动态语言在特定的问题领域可以写出很抽象的代码,实现很高的代码复用度,golang 在这方面就差了不少;没有泛型,很多时候只能靠运行时做 type cast 或者 type assertion 来解决
2. 未使用的变量 / import 会导致编译错误,这点对调试非常不友好,有时候为了注释掉一行代码要改好几个地方
2. 没有一个好用的包管理,使用过的里面感觉就 govendor 还能用,官方的 dep 还不成熟
3. 没有好用的 ORM:没有像 SQLAlchemy 一样强大的 ORM (这其实算是 1 的结果)
4. 标准库里的 errors 包没有 stacktrace (可以用 https://github.com/pkg/errors 来弥补)
5. 一些奇怪的规则,比如 internal 包不能被外部包 import 啦,比如 append 函数暴露了 slice 的底层实现啦,比如对 slice 做 for range 遍历的第二个元素其实是 slice 中对应元素的拷贝啦等等等等;这些问题基本上只能靠多写 & 多翻语言规范来解决了(不过有些问题语言规范也写得不是很清楚

举报 使用道具

回复
l1093178  新手上路  发表于 2018-1-31 15:31:11 | 显示全部楼层
@drackzy 我一个 Python 党都觉得 Golang 表达力弱,习惯了 Ruby 灵活性的程序员写 Golang 得被郁闷死吧(以及为啥不考虑 Elixir 呢)

举报 使用道具

回复
drackzy  新手上路  发表于 2018-1-31 15:35:50 | 显示全部楼层
@l1093178 ruby 国内就 web 太窄,大厂太少。go 能进中大厂,技术想往底层发展。亲戚 gaode 测试年终奖都 20W 眼馋了

举报 使用道具

回复
muninn  新手上路  发表于 2018-1-31 15:39:53 | 显示全部楼层
@l1093178
开始用的 glide 挺好的
dep 出来就跑去用
被 dep 坑了好多次。
但是现在已经好了。。。
最近一个月没出过问题了。

举报 使用道具

回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表