在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
【编者按】本文最早由 Repustate 发布,主要介绍将代码迁移至 Go(lang) 时的注意事项。文章系国内 ITOM 管理平台 OneAPM 编译呈现,以下为正文。 这是一篇讲述将大块 Python/Cython 代码迁移到 Go 的长文章。如果你想了解整个事情的经过、背景等所有信息,请读下去。如果你只对 Python 开发者需要了解的事感兴趣,请下拉到早该知道的事板块。 背景我们在 Repustate 最大的技术成果就是实现了阿拉伯语情感分析。阿拉伯语是个难啃的硬骨头,因为阿拉伯语词汇的形式非常复杂。阿拉伯语的标记化(把一句话拆分成单个单词)也比英语要难得多,因为阿拉伯单词内部可能会包含空格(例如单词内部“aleph”的位置)。在不泄露机密的情况下,Repustate 利用支持向量机(SVM)来获取一个句子最可能的意思,并且以此来推断句子的情感。我们一共采用了22种模型(22个支持向量机),文档中的每个词都会被分析。也就是说,如果一个文档包含500个词,就会与支持向量机进行10000多次对比。 PythonRepustate 几乎完全是用 Python 搭建的,我们使用 Django 来搭建 API 接口和网站架构。因此,为了保持代码一致性,使用 Python 来实现所有阿拉伯语情感引擎才说得通。就原型设计和实现流程而言,Python 依然是一个很好的选择:表现能力优秀,又有强大的第三方库资源,等等。如果是服务于网页,它就是最佳选择。如果是稍低级别的运算,需要与哈希表(Python 中的字典)进行大量对比时,运行速度就会慢下来。我们一秒钟只能处理2到3个阿拉伯语单词,这种速度太慢了。相比之下,我们的英语情感引擎每秒能处理500个单词。 瓶颈因此,我们启动了 Python 分析器,开始调查速度慢的原因。还记得上文提到我们有22个支持向量机,每个单词都会通过它们处理吗?原来这个过程是按顺序进行,而不是并行的。好了,第一个想法是换成类似分布式计算系统(map/reduce)的处理器。长话短说:Python 不适合用 map/reduce。当你需要并发性的时候,Python 并不能帮上忙。在 Pycon 2013大会中,Guido 谈到了 Tulip,他希望用来解决这个问题的一个新项目,但是还要过一段时间才能发布。可是,如果已经有了更好的选择,为什么还要苦等下去呢? 选择 Golang 还是回老家(Go Home)在 Mozilla 的朋友告诉笔者,Mozilla 服务的日志架构大部分代码都已迁移到 Go,部分原因是 goroutines 超级便利。Go 是由谷歌员工开发的,设计之初就将并发需求列为一级理念,而不是像 Python 的众多解决方案一样在做事后补救。因此我们开始着手实现从 Python 到 Go 的迁移。 虽然 Go 代码还没实现大规模产出,得到的结果已经非常振奋人心。我们现在一秒钟能处理1000个文档,使用的内存大大减少,而且也不用再去调试和解决使用 Python 时会遇到的多进程/协程(gevent)/“为什么 Control-C 杀死了我的进程”等问题。 喜欢 Go 的原因任何略懂编程语言的人(明白解释与编译、动态与静态区别)都会说:“哈,显然 Go 要快多了。”没错,我们是可以用 Java 重写所有内容,并且取得类似的效果,但是这并不是 Go 胜出的原因。你用 Go 写的代码似乎一出来是正确的。笔者也说不清楚,但是不知怎么的,一旦代码被编译(编译过程非常迅速),你就会感觉它能工作了(不只是运行不出错,而且还逻辑正确)。这听起来很含糊,但是它是真的。在冗余或无冗余方面,它跟 Python 相似,它把函数当做一级对象,因此函数编程很方便。而且毋庸置疑,goroutines 和 channels 会让你更加省心省力。静态类型还会带来极大的性能提升,以及更精确的内存分配控制,但是又不会损失太多表达性。 早该知道的事除去溢美之词,跟 Go 打交道需要与 Python 完全不同的一套思维模式。以下列出的是笔者在迁移时做的一些笔记——都是在从 Python 迁移到 Go 时随机想到的一些东西:
这么折腾值得吗?值,一百万个值,超值。速度的提升不容忽视。而且笔者认为这也是促使 Go 成为流行语言的重要原因。因此在招聘时,笔者认为把 Go 当成 Python 开发者的必备技能也很重要。 OneAPM 能帮你查看 Python 应用程序的方方面面,不仅能够监控终端的用户体验://blog.oneapm.com/tags-%E7%94%A8%E6%88%B7%E4%BD%93%E9%AA%8C.html,还能监控服务器性能,同时还支持追踪数据库、第三方 API 和 Web 服务器的各种问题。想阅读更多技术文章,请访问 OneAPM 官方技术博客。 本文转自 OneAPM 官方博客 原文地址: https://blog.repustate.com/migrating-code-from-python-to-golang-what-you-need-to-know/ |
请发表评论