作家
登录

核心代码从Python换成Go语言,提速30倍!

作者: 来源: 2018-03-28 15:05:06 阅读 我要评论

在优化代码库时节俭的时光归功于Go说话的特点。应用Python,法度榜样员不得不将表达式解析为抽象语法树,并优化/分析经由过程排名公开的每个函数。

沙龙晃荡 | 3月31日 京东、微博、华为拭魅战专家与你合营商量容器技巧实践!

选择机能优良的对象异常重要(Stream已经优化了Cassandra,PostgreSQL,Redis和很多其他技巧)。然而,有时发明体系中的瓶颈确切是Python引起的,像序列化,排序和聚合等计算沉重的义务有时会比大年夜收集数据存储检索数据花费更长的时光。


Stream公司比来将其核心办事的后端大年夜Python切换成了Go,固然他们内部还在应用Python,然则公司已经决定大年夜如今开端在Go中编写所有机能密集型代码。本文,Stream首席履行官和开创人Thierry Schellenbach说清楚明了公司的┞封一决定。

选择项目或产品的编程说话会受到很多身分驱动,与所有技巧决定计划一样,没有完美的谜底足以解决所有问题。Stream之所以这么做,是因为感触感染到了Go说话的巨大年夜好处。

这与Stream的产品有关。Stream是用于构建,缩放、个性化消息源和晃荡流的API。每月为3亿多用户供给约10亿次API请求。是以,机能和靠得住性是Stream制订每项技巧决定计划的最重要原因。

Python和GO:机能比较!

Go最大年夜的卖点可能就是机能,无论是运行时光┞氛样编译时光。它在大年夜多半计算基准测试中与Java或C ++相当。在Stream的实际应用中,GO比Python快大年夜约30倍。

Go编译器(本身是用Go编写的)也异常快。应用Go编写的Stream中最复杂的微办事只须要6秒即可编译完成,与Java和C ++等对象链比拟,这是一个重大年夜成功。

本地并发

经由过程goroutines和channel将并发性融入到说话中。Goroutines在概念上类似于操作体系线程,但异常便宜——每个成本只有几KB的客栈空间。Go运行时可以处理智能多路复竽暌姑goroutines,这一切对法度榜样员来说是透明的。单个法度榜样拥稀有千个goroutines并不罕有。例如,net / http软件包中的办事器为每个传入的HTTP请求创建一个goroutine。

此外,浏览Go说话代码往往异常简单,GO干净的风格让攫取和推理更轻易。

在真正的Go说话中,goroutine异常简单:只需在“go”关键字前添加一个函数调用,让它运行在本身的goroutine中即可。

Go世界的传统不雅点是“不经由过程共享内存来交换,相反的是,经由过程通信来共享内存“。在goroutines之间进行通信的原语是channel,它们与goroutines一样易于应用。channel有一个类型,可以经由过程直不雅的箭头语法轻松地在goroutine之间传递数据。固然简单,但channel异常强大年夜。经由过程预先推敲,与传统体系比拟,制造大年夜范围并发体系是一件易如反掌的工作。

应用简单的并发对象,可以解决那些经常导致缺点的复杂问题。Go随附内置竞速检测器,可以更轻松检测异步代码中的竞争状况。

生态体系

Go仍然是编译说话情况的新手,远比不上C ++和Java等传统说话的普及程度。固然只有大年夜约5%的法度榜样员知道Go,然则这个数字还在赓续增长,并且这种增长是因为说话的易用性所致。固然说话快速且功能强大年夜,但该说话只有25个保存字(与C ++ 92或Java 53比拟),对于大年夜多半开辟人员来说,它只会惹人很少的新概念。

随Go供给的内置库在开箱即竽暌姑,功能强大年夜。应用`net / http`包制造HTTP办事只须要几行代码,并且本地支撑http / 2,TLS和websocket等。社区软件包的生态体系也很出色,实用于Redis,RabbitMQ,PostgreSQL和RocksDB等。

其他福利

Go节俭时光的另一种方法是应用Gofmt。它是一个敕令行对象,可与大年夜多半编辑器集成并主动将代码格局化为事实标准。如不雅格局不精确,代码仍会编译,但除非经由过程gofmt运行代码以保持全部代码库格局一致,不然将不会查看pull请求。这使代码审查人员可以或许专注于代码而不是花时光抉剔格局。

Go有助于开辟微办事架构,gRPC和Google的协定缓冲区是治理微办事之间通信的好办法,Go有一流的支撑。

Python与Go

Stream办事中的一个强大年夜功能是排名提纲。排名提纲许可用户为提纲指定一个评分函数,以便控制提取时的排序方法。评分算法可以供给很多变量来肯定排名,但基于风行度的一个很好的例子可能是如许的:

图3:核心代码大年夜Python换成Go说话,提速30倍!
  1. 要支撑这种排名办法,Python和Go代码都须要:解析分数的表达式。在这种情况下,我们想将字符串“simple_gauss(time)* popular”变成一个函数,它将一个晃荡作为输入并返回一个分数作为输出。
  2. 根据JSON设备创建部分函数。例如,我们欲望“simple_gauss”以五天的刻度,一天的偏移量和0.3的衰减因子来调用“decay_gauss”。
  3. 如不雅在晃荡中没有定义某个字段,则应对“默认值”设备进行紧缩,以便进行回退。
  4. 应用步调1中的功能对Feed中的所有晃荡进行评分。

建立一个Go开辟团队比大年夜多半说话更轻易,因为它更轻易进修。

开辟Python版本的示例花了大年夜约三天的时光编写代码,单位测试和文档。接下来,团队花了大年夜怨?宪的时光来竽暌古化代码。个一一项优化是将分数表达式(simple_gauss(time)* popular)转换为抽象语法树。该团队还实施了高速缓存逻辑,预先计算了将来某些时光的分数。

比拟之下,开辟此代码的Go版本须要大年夜约四天的时光,并且机能不须要任何进一步的优化。固然Python的开辟初期看来更快,但Go版本最终须要的工作量大年夜大年夜削减。


  推荐阅读

  为什么说Web 3.0很重要?你需要了解哪些基础知识?

编者按:什么是Web 3.0?它与Web 2.0和1.0比拟有什么差别?Matteo Gianpietro Zago有本身的看法。他是The Internet of Block>>>详细阅读


本文标题:核心代码从Python换成Go语言,提速30倍!

地址:http://www.17bianji.com/lsqh/40987.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)