python和go,go比python简单吗
go语言和python的区别:1。python在接受输入时直接使用input函数,而go语言要一直监听scan();2.发送网络请求python处理比go语言更友好;3.go语言比python效率高;4.go语言很容易打包。
背景
主要的工作语言是Python。今年,我们需要制作性能测试工具。因为GIL锁,Python的表现实在是惨淡,所以我们需要学习一门高性能的语言来生成性能测试的压力面。所以我把目光放在了现在的菜鸟围棋上。经过一段时间的学习,我也写了一个小工具来记忆两种语言的区别。
要求
工具是一个小爬虫,用来抓取一个网站上某个产品的迭代记录。实现的逻辑是,运行脚本后,用户输入一些元素(产品ID等。)中,脚本会导出一个Excel文件。
的原始版本是用Python编写的,只用了不到30行代码就完成了。这次用Go重写,代码量大概110行。
接受输入
第一步是接受来自命令行的输入。该工具面向非技术人员,不适合获取CLI。想要的效果是逐行输入。用Python实现非常容易,像这样:app_id=raw_input(请输入app_id:)
App_analysis=raw_input(请输入分析:)
执行完之后就是一行一行往下,但是用Go就有点疼了。完整的代码如下:func getPara() (string,string) {
var i=0
var appId,分析字符串
Fmt。打印(请输入appId:)
扫描仪:=bufio。新闻扫描器(os。标准输入)
用于扫描仪。扫描(){
文本:=扫描仪。文本()
如果i==0
appId=text
Fmt。打印(请输入分析:)
} else if i==1 {
分析=文本
Fmt。打印(程序初始化数据完成。请按任意键继续’)
}否则{
破裂
}
我
}
返回appId,分析
}
CLI实现起来很方便,但是到了这种逐行输入的时候就要一直监控Scan(),于是就有了上面这个蛋疼的循环。而且你要先打印信息,再监控内容。整个写作过程很恶心。也许你还没有找到更好的方法。真的是逆天。
即时战略游戏
从发送请求的便利性来说,两种语言没有太大区别,至少我写的Get请求是这样的。计算机编程语言
params={
分析:app_analysis,
appid: app_id,
国家:中国
}
r=requests.get(url,params)Go
q :=req。URL.Query()
q.Add(appid ,appid)
问:添加(“分析”,分析)
q .添加(国家,中国)
请求。URL.RawQuery=q.Encode()
var resp *http。反应
resp,_=http。Do(req)
返回结果处理
Python太友好了,无法处理返回的结果。直接调用json就可以了。result=r.json()
但是,围棋有点疼。因为是静态语言,所以在解包数据时需要先定义数据格式。例如,返回的内容必须定义如下:type ResultInfo struct {
代码int
消息字符串
版本[]版本信息
}
类型版本信息结构{
版本字符串 json:version
ReleaseTime字符串` json:release_time
ReleaseNote字符串 json:release_note
AppName字符串 json:app_name
字幕字符串 json:subtitle
}
第一个ResultInfo是返回的数据,它的版本也是一个数组对象,所以需要定义另一个数组对象,这样就可以调用方法来解包。正文,_ :=ioutil。ReadAll(resp。正文)
var rst=ResultInfo{}
如果err :=json。解组(body,rst);呃!=零{
fmt。Println(错误)
}
将数据写入Excel
这部分调用是第三方库,没有可比性。代码的实现完全依赖于第三方包。
到处出错!=零
Go的异常捕捉机制不同于Python或者Java。Python的异常捕捉使用try和except来包装代码块,而Go使用一个error对象,所以所有的Go代码都会填充大量的if err!=零{
返回零,错误
}
这种鬼,这种不正常的机制在读代码的时候非常恶心,极大的影响了阅读体验。
吐完之后
基本上从写代码的过程来看,Python的编码效率比Go高很多。Go号称语法灵活,可以大大提高编码效率。其实不是,而且受静态语言的限制。与Python这种动态语言相比,编码效率差距还是很大的。只有口语比其他静态语言效率高。
但是!Go比Python效率高很多。例如,有一种算法可以计算吸引叶子的数量。Go的实现如下:
func main() {
常数n=40
开始时间:=时间。现在()
fibN :=fib(n)
结束时间:=时间。现在()
成本时间:=结束时间。Sub(开始时间)
fmt。Println(成本时间)
fmt。Printf(\rFibonacci(%d)=%d\n ,n,fibN)
}
函数纤维(x整数)整数{
如果x 2 {
返回x
}
返回光纤(x-1)光纤(x-2)
}
这是一个简单的递归。当n为40时,Go耗时约1秒,执行结果如下:876.838ms(耗时)
斐波那契(40)=102334155
让我们换成Pythondef fib(x):
如果x2:
返回x
返回光纤(x-1)光纤(x-2)
if __name__==__main__ :
导入时间
begin=time.time()
印刷纤维(40)
end=time.time()
打印结束-开始
同样的执行逻辑,但是执行结果是:102334155。
2.8657081127(时间消耗)
WTF!Go的效率是Python的50多倍。
这还不是全部。工具写出来之后,总要被人用。Python写出来之后,如果被非技术人员使用,那么。用户:怎么用?
Me:您安装Python,然后匹配环境变量,并安装请求库和xlwt库。
我:要安装这两个库,得先安装pip。
用户:黑人问号脸!
如果用Go写,打包发就好了。用户:怎么用?
我:你双击,想打什么就打什么。
如果用户用的是Windows系统,那没问题。
CGO _ ENABLED=0 GOOS=windows go arch=amd64 go build XXX . go
直接打包成exe文件。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。