转载请参见文章末尾处的要求。【感谢张佳伟(@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语言之前需要了解什么?
给您推荐相同类型的内容:
如何在R语言中计算C-index
利用Hmisc包中的rcorr.cens函数 局限: - 只能处理一个预测变量 - 对超过2分类的分类变量处理粗糙# 加载包及生成数据框,这里生成数据框主要是为了方便大家理解,因为大家通常都是将Excel的数据读进R,存储为数据框格式lib学习C语言需要掌握哪些基本知识?
1.入门程序#include <stdio.h>int main(){printf("Hello World!")return 0}2.数据类型数据类型:1.基本数据类型:1.1. 整型python如何去除重复行并分别统计重复的行数?已有去除重复的代码
python的速度效率是不高的,如何对速度要求比较高的话建议可以用c来写。我写了这个代码,python2.6+windows xp测试通过。希望能帮到你~===========================================r语言创建扑克牌要54张
一副扑克牌有54张,要想保证获胜可按以下策略:自己先拿4张,轮到对手抓时假设对方抓x(x在1到4之间)只牌,自己抓时,抓的牌只数为5-x就行了。。。。一直这样轮流下去最后一张肯定就是自己拿了1、保皇是用四副扑克牌,五个人一起玩的扑克牌游戏。韩星IU简介
李智恩,韩国Solo女歌手IU,于2008年出道,已经发行了多张专辑。中文名: 李智恩外文名: IU(아이유)国籍: 韩国出生日期: 1993年05月16日经纪公司: LOEN Entertainment血型: A身高: 16R语言 wordcloud2 画图怎么在网页显示,自定义的图和letterClou
我最近才遇到这个问题,这个跑出来的视乎不是个图片,而是一个html和js的东西,so可以你用htmlwidgets这个包导出来,这个是安装wordcloud2包时已经安装了的,所以直接library就可以了,语句就:htmlwidgets:如何在centos下安装ruby
yum list |grep rubyyum install ruby ruby-devel ruby-rdoc ruby-irb rubygemsgem install rails首先,下载好所有的gem文件(其实就是bundle文件),为什么说”人生苦短,我用python解析“
Python具有丰富和强大的库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是CC++)很轻松地联结在一起。常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中[3]有特别要求我的世界恶魔果实模组手机版为什么打不开文件?
1.当 java 和 mod 碰撞时会发生错误。图2。不是正确的版本,与 mod 3相同的版本。修改错误,在线修改一些也是无用的。图4。伪造版本与 mod 版本不兼容: 下载一个 multiplay my world box,它会自动加载怎样做一名合格的Java实习生?
一般学完Java后都是从Java实习生开始自己的职业生涯,Java实习生要说一抓一大把,你信吗?很多朋友是相信的,因为当下学Java的队伍是越来越庞大,你只有成为一名合格的Java实习生,那么未来你的职业生涯才能够越走越顺,如何成为合格的JC语言单链表
C语言创建单链表如下:#include"stdio.h"#include"stdlib.h"#include"malloc.h"#include "iostreac语言中,!(--x)什么意思?
C语言运算符,括号里面(---x)表示x的值减去1,相当于“x”变为“x-1”,括号外面“!”表示取反(非0数变为0,0变为1)。除了常见的三大类,算术运算符、关系运算符与逻辑运算符之外,还有一些用于完成特殊任务的运算符,比如位运算符。扩请问 java中"% "与 " "之间的区别?
%是求模运算符;是除运算符;二者都是双目运算符。它们之间的区别就是:%是求余运算,即2%10=2,10%2=0,10%3=1。是普通的除号,即102=5Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技RAL标准颜色7032,7032这四个数字各代表什么?
7032只是颜色的编号,没有什么特定意义。RAL色号对照表数字"1"开头的1000 Green beige 米绿色1001 Beige 米色,淡黄或灰黄1002 Sand yellow 沙黄色1003 SignalR语言怎么检验分布是不是T分布
ks.test()实现了KS检验,可以检验任意样本是不是来自给定的连续分布。你这里的用法就是:ks.test(data,pt,df=df) #data是样本的数据,df是要检验的t分布的自由度我们可以用很多方法分析一个单变量数据集的分布。最用python画正五边形的代码?
以下是使用 Python 的 turtle 图形模块绘制常规五边形的一种方法:此代码创建一只从屏幕底部中心开始的,然后绘制边长为 200 个单位的常规五边形。它将在每条边后旋转 72 度,这是绘制常规五边形所需的角度。最后,该命令会阻止窗口web开发中哪个后端语言开发效率最高
JavaScript按照当前的流行趋势来看,JavaScript 是一门性价比非常高的语言。因为只要是Web,就会有前端,只要有前端,就需要有JavaScript。与此同时,Node.js 在后台中的地位已经愈发重要了。对一般的项目而言,Go语言的开源项目
1.Docker项目 网址为 https:github.comdockerdocker 。 介绍:Docker是一种操作系统层面的虚拟化技术,可以在操作系统和应用程序之间进行隔离,也可以称之为容器。Docker可以在一台物理C语言“在字符串中删除指定的字符”怎么编写程序?
从字符数组中删除特定的字符,即输入要删除的指定字符,利用for循环找到非指定字符,将非指定字符输出即可。以下为具体的实现方法:#include<stdio.h>int main(){char str[100]c语言中%X是什么意思
C语言中%X的意思是以十六进制数形式输出整数,类似%x的输出格式还有:1.%c:单个字符2.%d:十进制整数3.%f :十进制浮点数4.%o:八进制数5. %s :字符串6.%u:无符号十进制数7.%%:输出百分号%%x意思是python代码转化为sas代码
,Python 和 SAS 是两个很常用的数据挖掘工具。Python 开源、免费、有丰富的三方库,一般在互联网公司广泛使用。而SAS需付费,且费用较高,一般互联网公司无法承担,更多的是在银行等传统金融机构中使用,不过这两年由于Python太0'是在c语言中是什么意思?
'0'是字符常量,在ASCII(美国标准信息交换代码)字符集中,数字‘0’的代码是48,运用不同的格式,其作用也不同,要求输出值为d类型是其值可代表为48,为c类型时其值为0等等用法。printf语句中格式字符串%r语言贝叶斯判别先验概率怎么去
Bayes判别,它是基于Bayes准则的判别方法,判别指标为定量资料,它的判别规则和最大似然判别、Bayes公式判别相似,都是根据概率大小进行判别,要求各类近似服从多元正态分布。1. Bayes准则:寻求一种判别规则,使得属于第k类的样品在如何发布vc调用Python的独立运行的程序
译Python脚本生成可执行程序,可以通过py2exe编译完成。在VC中调用python时,可以结合py2exe,完成整个程序的独立发布google.py:#! usrbinenv pythonimport sys, webbrpython结束程序的语句
sys.exit()Python中,当有时当一个条件成立的情况下,需要终止程序,可以使用sys.exit()退出程序。sys.exit()会引发一个异常。1.如果这个异常没有被捕获,那么python编译器将会退出,后面的程序将不会执行。2.go语言的全称
Go全称Golang。Go语言由Google公司开发,并于2009年开源,相比JavaPythonC等语言,Go尤其擅长并发编程,性能堪比C语言,开发效率肩比Python,被誉为“21世纪的C语言”。Go语言在云计算、大数据、微服务、高多项式回归和多元式回归区别!
方差分析与回归分析是有联系又不完全相同的分析方法。方差分析主要研究各变量对结果的影响程度的定性关系,从而剔除对结果影响较小的变量,提高试验的效率和精度。而回归分析是研究变量与结果的定量关系,得出相应的数学模式。在回归分析中,需要对各变量对结c语言基础代码,越详细,解释越简单,越好
你并没有把详细的 C 语言基础代码写出来,别人怎么帮助你添加注释语句啊?因为所说的 C 语言基础代码实际上并没有一定之规。怎么样才算是基础代码、有几行代码就可以、足够了?这些都是灵活的、并不是一成不变的。例如,最、最简单的 C 语言基础代码go defer,panic,recover详解 go 的异常处理
golang中defer,panic,recover是很常用的三个特性,三者一起使用可以充当其他语言中try…catch…的角色,而defer本身又像其他语言的析构函数 结果: 例1 例2 例3 请先不要向下看,在心里golang标准库之sort
标准库sort实现了4种排序方法, 插入排序 、 堆排序 、 快排 和 归并排序 ,但是并没有暴露给用户接口。sort包会根据数据选择最优的排序方法(其实只使用了3种, 归并排序 除外)。 用户需要实现以下接口才能使用sort包的排序