转载请参见文章末尾处的要求。【感谢张佳伟(@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语言之前需要了解什么?
给您推荐相同类型的内容:
pyc文件生成错误(2019-01)
线上突然出问题,访问全部报错。定位过程:1.看日志很奇怪,全部是import error,但是包全部安装了。 2.看监控及机器异常,看到文件句柄有突增3.访问量突增,导致进程数变多,加载文件变多。然后看一下pyc文件,发it个人简历范文_优秀程序员个人求职简历
现在IT工作人员找工作都是在通过网络来找,因此一份良好的个人简历对于获得面试机会至关重要。本文是我为大家整理的it个人简历 范文 ,仅供参考。it个人简历范文篇一 个人信息: 姓 名: 性 别: 男 年 龄: 2C语言结构体编程
1、structREC{int n char c}REC t1,t2修改 struct RECt1,t2因为不是所有编译器都支持你那种写法2、typedef structREC{int n=0char c=’A’}t1,请教:R语言中统计矩阵中某一列的某个元素出现的次数的函数。
如果是统计整个矩阵,比如y那么直接table(y)>y [,1] [,2] [,3][1,]123[2,]222[3,]321>table(y)y1 2 3 2 5 2 所以如果统计所有列,那就自己写个循环吧for(go是什么编程语言?主要应用于哪些方面?
Go语言由Google公司开发,并于2009年开源,相比JavaPythonC等语言,Go尤其擅长并发编程,性能堪比C语言,开发效率肩比Python,被誉为“21世纪的C语言”。Go语言在云计算、大数据、微服务、高并发领域应用应用非常广厦门java培训学校哪里好
厦门java培训班是厦门课程专业全、实力强、规模大、师资力量雄厚、服务完善的校区。同时也是厦门java培训班APTECH总部全线产品授权中心,秉承“教育改变生活”的发展理念,一直致力于培养IT技能型高端人才。厦门java培训班成立于2008java入门需要多长时间?
学习是场持久战,短时间的突击学习收获并不是很大,学习重在行动、贵在坚持,能坚持下来才是最难能可贵的。学习java,说实话,入门并不难,但是学精可不容易!对于零基础学习java编程所需要的时间也是受很多因素影响的,比如,你自身的学历,学习态懂股票看盘的请进!~~
Dear 日勿成:您问的是K线图第一,K线下面的小矩形,一般业内不叫它窗口,而是叫它"棒"或"线"。分为红棒(线)与蓝棒(线)两种。红棒(线)表示上涨,蓝棒(线)表示下跌。红棒的下缘价位是当日开盘价,面试问题总结(一)Golang
使用go语言的好处: go语言的设计是务实的, go在针对并发上进行了优化, 并且支持大规模高并发, 又由于单一的码格式, 相比于其他语言更具有可读性, 在垃圾回收上比java和Python更有效, 因为他是和程序同时执行的.1.什么是C语言程序设计?
什么是C语言?C语言的简介。C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点。它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。因此,它的应用范围广泛,不仅服务端调用轻量java
项目需求服务器端项目是用mina写的传统socket,准备升级到支持websocket接入。为什么采用undertow1、Undertow 是基于 NIO 的高性能 Web 嵌入式服务器,并且支持websocket(这个很重要,只要把undGolang WaitGroup结合Channel 控制并发数量
https:studygolang.comarticles17811?utm_source=joyk.com&utm_medium=referral&hmsr=joyk.com首先,看一下TCP握手简单描R语言作业-统计30题
链接: http:www.bio-info-trainee.com4385.html我做题的时候主要翻阅学习了《R语言实战》里统计相关内容。 需要掌握R内置数据集及R包数据集 鸢尾花(iris)数据集,包含150个鸢尾谁来帮用通俗易懂的语言解释下java的反射机制
谁来帮用通俗易懂的语言解释下java的反射机制Java Reflaction in Action有这么一句话,可以解释。反射是运行中的程序检查自己和软件运行环境的能力,它可以根据它发现的进行改变。通俗的讲就是反射可以在运行时根据指定c语言中**str与str[1]有什么关系,str[1]是不是双重指针第二个指针的地址呢?
这要看你怎么定义,比如 integer **str[10],就是定义了一个就是指向指针的指针数组,str[1]就是它的第二个指针。**定义了类型,[1]确定了数组的第二个元素。如果定义是 integer **str;则你不能用str[1]来java栈内存溢出怎么解决
第一对所有的代码包括页面中的java代码都进行一遍彻底的回顾检查,1.对那些静态(static)的对象要特别留神,特别是类型为Map,List,Set的,静态的变量会一直驻存在内存中,生命周期比较长,不会被垃圾器回收。2.对于代码,要审查是求《C语言程序设计现代方法第二版》全文免费下载百度网盘资源,谢谢~
《C语言程序设计现代方法第二版》百度网盘pdf最新全集下载:链接:https:pan.baidu.coms1ZxPIF7PSVBGWtDl8h_kjNA?pwd=hcut 提取码:hcut简介:时至今日,C语言仍然是计算机领域的通R语言怎么求出一个字段的重复?
duplicated() 找出重复出现的元素。给出一例子>test<-c(21,22,22,23,22,23,24)>duplicated(test)[1] FALSE FALSETRUE FALSER语言操作otu丰度表:分行列计算平均和标准差
公众号的读者留言问答的问题,首先他的数据集如下 1 这个是数据集按行求平均 2 这个是数据集中按行求标准差 3 这个公式的计算方法是先按照行求平均值得到一个向量a,按行求标准差得到一个向量b,最后是按照列来进行abs(x-a)Java培训课程有哪些
java作为一个主流的开发语言,应用相对比较普遍,java课程涵盖的知识内容是比较丰富多样的,所以学习起来也需要一定的时间。下面小编就详细的为大家简单的来介绍一下,java培训课程都有哪些内容。第一阶段:Java核心基础掌握Java语法基R语言ggplot2做簇状柱形图并添加误差线的一个完整示例
原始数据存储在一个excel文件里,这个excel文件里有三个子表格,每一个子表格的数据如下: 总的数据格式 现在的需要是做如下的图 比如这里我新建了一个子表格sheet4,数据最终的格式如下 这里用到的是标准误 这里Go语言输出打印--排坑
一.几种公共方法 1)Print: 输出到控制台(不接受任何格式化,它等价于对每一个操作数都应用 %v)print 在golang中 是属于输出到标准错误流中并打印,官方不建议写程序时候用它。可以再debug时候用 2)Pr求C语言编日历源代码的详细说明
*稍微改了下对齐格式,加了注释**1、闰年的算法:如果某年能被4整除但不能被100整除,或者能被400整除,则该年是闰年.用表达式表示就是(year%4==0&&year%100!=0)||(year%40r语言randomforest包下载不了
原因:1.可能因为lib没有制定文件夹,导致R不知道下载哪里;2.可能因为源用不了(一个是没有在global option里面选择,一个是因为开了vpn)解决:#.libPaths("C:UsersyeziguniangDoGo切片数组深度解析
Goroutine调度是一个很复杂的机制,下面尝试用简单的语言描述一下Goroutine调度机制,想要对其有更深入的了解可以去研读一下源码。 首先介绍一下GMP什么意思: G ----------- goroutine: 即Go协程Java培训课程有哪些
java作为一个主流的开发语言,应用相对比较普遍,java课程涵盖的知识内容是比较丰富多样的,所以学习起来也需要一定的时间。下面小编就详细的为大家简单的来介绍一下,java培训课程都有哪些内容。第一阶段:Java核心基础掌握Java语法基请问在R语言中是用exp(x)表示e^x吗?
是的。R语言中exp函数,用法和作用均与MATLAB中相同。MATLAB中也有exp函数。如果在命令窗口中输入:exp(0)则输出:1。其实MATLAB和C中的exp函数和数学中以e为底的指数函数都是一样的。高等数学里的以e为底的指数函python 多进程
基于官方文档:https:docs.python.orgzh-cn3librarymultiprocessing.html日乐购,刚才看到的一个博客,写的都不太对,还是基于官方的比较稳妥 我就是喜欢抄官方的,哈哈相关性热图的绘制及意义
关于相关性,表示数据之间的相互依赖关系。但需要注意,数据具有相关性不一定意味着具有因果关系 。 相关性在组学数据挖掘中应用非常广,如样本的重复检验、基因的共表达分析、微生物群落的共发生网络分析等。 相关性分析其实较为简单,用R语GoLang -- json文件操作
json格式可以算我们日常最常用的序列化格式之一了,Go语言作为一个由Google开发,号称互联网的C语言的语言,自然也对JSON格式支持很好。官方提供的Json解析包已经非常强大,我们接下来讲解Json的序列化与反序列化操作。另外