转载请参见文章末尾处的要求。【感谢张佳伟(@ghosert)的热心翻译。如果其他朋友也有不错的原创或译文,可以尝试推荐给伯乐在线。】这是一篇(长)博文, 介绍了我们在 Repustate 迁移大量 Python/Cython 代码到 Go 语言的经验。如果你想了解整个故事,背景和所有的事情,请继续往下读。如果你只是想了解 Python 开发者在一头扎进 Go 语言前需要了解什么,请点击一下链接:从Python迁移到Go的建议(Tips &Tricks) 背景在Repustate,我们完成过的最棒的技术成就之一是实现了阿拉伯语的情感分析。阿拉伯语是一块难啃的硬骨头,因为它的词形变化相当复杂。比起譬如英语,阿拉伯语的分词(将一个句子切分呈几个独立的单词)也更困难,因为阿拉伯语的单词本身还可能会包含空白字符(例如:“阿列夫”在一个单词里的位置)。这也谈不上是泄密,Repustate 使用支持向量机(SVM)来获取一个句子背后最有可能的含义,并在其中加上情感元素。 总体上来说,我们使用了 22 种模型(22 个 SVM) 并且在一篇文档中,每一个单词我们都会加以分析。因此如果你有一篇 500 字的文档,那么基于 SVM,会进行十万次的比较。 PythonRepustate 几乎完全就是一个 Python 商店。我们使用 Django 来实现 API 和网站。因此(目前)为了保持代码一致,同时使用 Python 来实现阿拉伯语情感引擎是合情合理的。只是做原型和实现的话,Python 是很好的选择。它的表达能力很强悍,第三方类库等等也很好。如果你就是为了Web服务,Python 很完美。但是当你进行低级别的计算,大量依赖于哈希表(Python 里的字典类型)做比较的时候,一切都变慢了。我们每秒能处理大约两到三个阿拉伯文档,但是这太慢了。比较下来,我们的英语情感引擎每秒能处理大约五百份文档。 瓶颈因此我们开启了 Python 分析器,开始调查是什么地方用了那么长时间。还记得我前面说过我们有 22 个 SVM 并且每个单词都需要经过处理吗?好吧,这些都是线性处理的,非并行处理。所以我们的第一反应是把线性处理改成 map/reduce 那样的操作。简单来说:Python 不太适合用作 map/reduce。当你需要并发的时候,Python 算上好用。在 2013 Python 大会上(译者:PyCon 2013),Guido 谈到了 Tulip,他的这个新项目正在弥补 Python 这方面的不足,不过得过段一段时间才能推出,但是如果已经有了更好用的东西,我们为什么还要等呢? 选Go 语言,还是回家算了?我在Mozilla的朋友告诉我,Mozilla 内部正在将他们大量的基础日志架构切换到 Go 语言上,部分原因是因为强大的 [goroutines]。Go 语言是 Google 的人设计的,并且在设计之初就把支持并发作为第一要务,而不是像 Python 的各种解决方案那样是事后才加上去的。因此我们开始着手把 Python 换成 Go 语言。虽然Go 代码还不算正式上线的产品,但是结果非常令人鼓舞。我们现在能做到每秒处理一千份文档,使用更少的内存,还不用调试你在 Python 里遇到:丑陋的多进程/gevent/“为什么 Control-C 杀不了进程”这些问题。 为什么我们喜欢 Go 语言任何人,对编程语言是如何工作(解释型 vs 编译型, 动态语言 vs 静态语言)有一点理解的话,会说,“切,当然 Go 语言会更快”。是的,我们也可以用 Java 把所有的东西重写一遍,也能看到类似更快的改善,但那不是 Go 语言胜出的原因。你用 Go 写的代码好像就是对的。我搞不清楚到底是怎么回事,但是一旦代码被编译了(编译速度很快),你就会觉得这代码能工作(不只是跑起来不会错,而且甚至逻辑上也是对的)。我知道,这听上去不太靠谱,但是确实如此。这和 Python 在冗余(或非冗余)方面非常类似,它把函数作为第一目标,因此函数编程会很容易想明白。而且当然,go 线程和通道让你的生活更容易,你可以得到静态类型带来的性能大提升,还能更精细的控制内存分配,而你却不必为此在语言表达力上付出太多的代价。 希望能早点知道的事情(Tips &Tricks)除去所有这些赞美之词以后,有时你真的需要在处理 Go 代码的时候,相对于 Python,改变一下思维方式。因此这是我在迁移代码时记录的笔记清单 —— 只是在我把 Python 代码转换到 Go 时从我脑子里随机冒出来的点子:没有内建的集合类型(必须使用map,并检查是否存在)因为没有集合,必须自己写交集,并集之类的方法没有tuples 类型,必须写你自己的结构,或者使用 slices (即数组)没有类似 \__getattr__() 的方法,你必须总是检查存在性,而不是设置默认值,例如,在 Python 里,你可以这样写 value = dict.get(“a_key”, “default_value”)必须总是检查错误(或者显式的忽略错误)不能有变量/包没被使用,因此简单的测试也需要有时注掉一些代码在[] byte 和 string 之间转换。 regexp 使用 [] byte (不可变)。这是对的,但是老把一些变量转换来转换去很烦人Python 更宽松。你可以使用超出范围的索引在字符串里取一个片段,而且不会出错。你还可以用负数取出片段,但是 Go 不行你不能混合数据结构类型。也许这样也不太干净,但是有时在 Python 里,我会使用值是混合了字符串和列表的字典。但是 Go 不行,你不得不清理干净你的数据结构或者使用自定义的结构不能解包一个 tuple 或者 list 到几个不同的变量(例如:x, y, z = [1, 2, 3])驼峰式命名风格(如果你没有首字大写方法名/结构名,他们不会被暴露给其它的包)。我更喜欢 Python 的小写字母加下划线命名风格。必须显式检查是否有错误 != nil, 不像在 Python 里,许多类型可以像 bool 那样检查 (0, “”, None 都可以被解释成 “非” 集合)文档在一些模块上太散乱了,例如(crypto/md5),但是 IRC 上的 go-nuts 很好用,提供了巨大的帮助。从数字到字符串的转换(int64 ->string) 和 []byte ->string (只要使用 string([]byte))不太一样。需要使用 strconv。阅读Go 代码比起 Python 那样写起来如伪代码的语言更像一门编程语言, Go 有更多的非字母数字字符,并且使用 || 和 &&, 而不是 “or”和“and”写一个文件的话,有 File.Write([]byte) 和 File.WriteString(string), 这点和 Python 开发者的 Python 之道:“解决问题就一种方法 ”相违背。修改字符串很困难,必须经常重排 fmt.Sprintf没有构造函数,因此惯用法是创建 NewType() 方法来返回你要的结构Else (或者 else if)必须正确格式化,else 得和 if 配对的大括号在同一行。奇怪。赋值运算符取决于在函数内还是函数外,例如,= 和 :=如果我只想要“键”或者只想要 “值”,譬如: dict.keys() 或者 dict.values(),或者一个 tuples 的列表,例如:dict.items(),在 Go 语言里没有等价的东西,你只能自己枚举 map 来构造你的列表类型我有时使用一种习惯用法:构造一个值是函数的字典类型,我想通过给定的键值调用这些函数,你在 Go 里可以做到,但是所有的函数必须接受,返回相同的东西,例如:相同的方法签名如果你使用 JSON 并且 你的 JSON 是一个复合类型,恭喜你。 你必须构造自定义的结构匹配 JSON 块里的格式,然后把原始 JSON 解析到你自定义结构的实例中去。比起 Python 世界里 object = json.loads(json_blob) 要做更多的工作 是不是值得?值得,一百万倍的值得。速度的提升太多了,以致很难舍弃。同时,我认为, Go 是目前趋势所在,因此在招新员工的时候,我认为把 Go 当作 Repustate 技术积累的重要一环会很有帮助。]你好目前go语言软件包相对较少。其开发的docker。文明于世。Python模块包超级多。语法简练。而且开发周期短。适合短期项目。go适合做后台开发和分布式开发。所以选取那种语言其实要看场合。语言没有好坏。也没必要放弃谁学谁。有能力多学一门。毕竟技多不压身。祝你顺利。
Python开发者在转到Go语言之前需要了解什么?
给您推荐相同类型的内容:
武林盟主(C语言)
光看了 for(i=0i<ni++)for(j=ij<nj++){if(power[i]>power[j])这一个部分,我想到了超时……从最基本的流程学起,从最基本的语句学起。在学习的过程中,特别注意每个r语言如何绘制带标准误的线性关系图
r语言绘制带标准误的线性关系图1.打开文件,输入几组具有线性关系的数据。2.用鼠标选中这些数据,点击菜单栏中的“插入”选项。3.在插入菜单中,选择一种散点图。4.右击图表中的散点,在其右键菜单中点击“添加趋势线”选项。5.在出来的页面中,选JAVA语言的历史
Java从1995诞生至今,只有10年左右了,和C,C++这些老大哥比起来年轻了很多,哲学上说任何事物的产生都是必然的,Java也不例外了,Inter的迅猛发展导致了Java的迅猛发展,那句成语是怎么说来着,水涨船高,Java自然成为c语言中进位制是什么意思
先说下它的定义:进位制也就是进制,是人们规定的一种进位方法。对于任何一种进制---X进制,就表示某一位置上的数运算时是逢X进一位。十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。---摘自百度百科那origin瀑布图怎么透视
origin瀑布图透视步骤为:1、导入数据。打开origin软件,导入需要的数据,可以复制粘贴也可以直接导入文件。数据和点线图一致,都是一列x,多列y。2、绘制3D瀑布图。选中需要数据,右键或者点击绘图,找到瀑布图,初次绘图。3、设置瀑布图Ruby on Rails开发效率高,到底是因为Ruby语言还是Rails框架
都有吧 ruby脚本语言的特性+元编程的强大能力,简洁的同时提供了很多方便快捷的写法,主要是代码本身上的优化 rails语言配置优先,MVC逻辑分离,使得项目精简、结构化,主要带来的是全局上的好处光rails框架本身就足够高率了,但基于C语言为什么会被人说的那么强大,C语言到底能做啥
一、c语言是一种计算机编程语言具有程序设计语言的特性,又具有汇编语言的特性。c语言可当做工作中控制系统设计语种,撰写系手机应用程序,还可以当做运用编程语言,撰写不依靠计算机硬件的手机应用程序。二、运用条件广泛应用具有较强的数据预处理能力,不c语音是一种什么语言?
高级语言。C语言是一门面向过程的计算机编程语言,与C++、Java等面向对象编程语言有所不同。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。C语言描述问题比go语言中怎么定义一个string数组?
下边是slice的申明和使用其实这就是一种动态的数组复制代码 代码如下:package mainimport "fmt"func main() {d := []int{1, 2, 3} 申明一个slice这个是动态的【R语言】R中的因子(factor)
R中的因子用于存储不同类别的数据,可以用来对数据进行分组,例如人的性别有男和女两个类别,根据年龄可以将人分为未成年人和成年人,考试成绩可以分为优,良,中,差。 R 语言创建因子使用** factor() **函数,向量作为输入参数。go是什么编程语言?主要应用于哪些方面?
Go语言由Google公司开发,并于2009年开源,相比JavaPythonC等语言,Go尤其擅长并发编程,性能堪比C语言,开发效率肩比Python,被誉为“21世纪的C语言”。Go语言在云计算、大数据、微服务、高并发领域应用应用非常广c++ 易语言,go语言,哪个速度快,哪个对内存的控制,最弱???
易语言的价值在于预先封装好了很多连手册都不用看就知道怎么用的库适合写各种小工具等, 其它各方面都没法和主流语言比c++显然是速度最快的, go对比c++一是有自动内存回收, 二是作为近些年才推出的语言在语法上更简洁更现代化想学go语言有什么常用的java开发框架有哪些
Java开发开发框架有很多,给大家推荐下面几种:1、struts2框架,这是最经典的框架(可以说没有“之一”)。可以帮你快速搭建出一个MVC模型出来。2、Spring:Spring是轻量级的J2EE应用程序框架。3、Hibernate:HiC语言编程 写一个函数,将数组中的元素按反序存放。主控函数完成数据的输入与输出。
#include<stdio.h>#include<string.h>void printit(char *str,int length) 返序输出函数{int ifor(i=length《Go语言程序设计》epub下载在线阅读,求百度网盘云资源
《Go 语言程序设计》(Mark Summerfield)电子书网盘下载免费在线阅读资源链接:链接:https:pan.baidu.coms1SVbBaPldaVXv49op6H6klw提取码:br6t 书名:Go 语言程序Ruby请问翻译成中文是什么意思
Ruby翻译成中文是:红宝石,也可用作人名,多指女性。ruby英 ['ruːbɪ] 美 ['rubi]n. 红宝石;红宝石色adj. 红宝石色的vt. 使带红宝石色n. (Ruby)人名;(法)吕比;(英、西、德、匈、瑞数据库及pdf文件输出
【C++库】PDF类库 PoDoFo http:podofo.sourceforge.netPoDoFo 是一个用来操作 PDF 文件格式的 C++ 类库。它还包含一些小工具用来解析、修改和创建 PDF 文档。Xpdfhttp:w三星c3518手机运行qq2010出现Java错误该咋办啊
三星手机对java的支持一向不好,手机QQ2010太大了超过了你手机所能运行的java程序最大值,所以很遗憾是没办法用的。除非官方推出适合你手机的2010精简版。目前官方推荐的版本是手机QQ2009精简版,去手机QQ官网下载吧。而且09和1java编程需要什么基础
1、java基本知识:Java语法格式、关键字、标识符、运算符、程序流程控制语句以及其应用场景等。2、基本编程语言:java基本编程语言包括html、css、javascript等,这些是网页制作的关键。3、框架:需要掌握spring、spr语言编程的步骤
r语言编程的步骤?R是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。工具原料一台电脑下载完毕的R software方法步骤分步阅读15安装完毕R语言,4.1 Go语言中包(Packages)基础知识
先看一下目录结构,注意这里的src名称是必须的,go在设置了GOPATH后,默认会添加src去寻找package,暂未查询是否有方法不按照src查询 根据上面的描述,Go语言中通过包中函数的名称来区分公共函数和私有函数,我们在m如何配置go语言开发环境
1、下载go的zip文件。并且一定要把文件解压到c:go目录下。2、配置windows的高级环境变量。包括:GOROOT、GOOS、GOBIN、GOARCH。并且在path变量里面把c:gobin加入。以便可以在命令行直接运行go命令C语言如何把yx,赋值给变量y
yx是什么数据类型,是变量、或字符串常量?若为变量,可以如此:int y,yxy=yx若为字符串常量,可如此:char a[]="yx"char *p=a这个命题本身存在不明确的地方。我假设X,Y都是数字0,1,...9r代码默认的颜色怎么改回来
r代码默认的颜色改回来使用scales包。R语言ggplot中的颜色ggplot2分组时默认使用的颜色,可以从另一个hadley写的包,进入scales包中有调用改变颜色。这个包算是一个工具包,用于和hadley写的其他包配合使用,颜色是其go中怎样形象的理解接口
Java不支持多重继承,即一个类只能有一个父类 为了克服单继承的缺点,Java使用了接口,一个类可以实现多个接口 接口是抽象方法和常量值定义的集合,是一种特殊的抽象类 接口中只包含常量和方法的定义,没有变量和方法的实现 接口中的所有方法都python中单,双引号和三个双引号的区别
先说1双引号与3个双引号的区别,双引号所表示的字符串通常要写成一行 如: s1 = "hello,world" 如果要写成多行,那么就要使用 (“连行符”)吧,如 s2 = "hello, world&qu邮轮旅游哪艘船比较好
每个航区都有不错的一条船和航线,比如阿拉斯加航线、北欧航线,公主邮轮就不错,加勒比海航线的话 皇家和NCL的船不错,地中海航线 MSC地中海邮轮不错,大溪地的话就保罗高更号等等。可以咨询七海邮轮,具体挑选合适的邮轮以供参考。比如阿拉斯加看求短发或齐肩发,波波头也可以的动漫人物女生,我想cos
another里面的见崎鸣,rwby里的ruby,中二病也要谈恋爱里的小鸟游,某科学的超电磁炮里的御坂美琴,进击巨人里的三笠·阿克曼,还有境界的彼方里的栗山未来,都是比较好cos的角色您好~这是RWBY中的RUby.现在该动画每周五更新一如何利用Python中的Pandas库绘制柱形图
我们利用Python的Pandas库可以绘制很多图形,那么如何绘制柱形图呢?下面我给大家分享演示一下。工具材料Pycharm 01首先我们打开Excel文件,准备要生成柱形图的数据表,如下图所示02接下来在Pythoc语言中用递归法求最大公约数,要求如下,我试过好多次都不行,求大神帮忙,先谢谢了
#include<stdio.h>int ged(int a, int b)int main(){ int a,b scanf("%d %d",&a, &b