背景
工作中的主力语言是Python,今年要搞性能测试的工具,由于GIL锁的原因,Python的性能实在是惨淡,需要学一门性能高的语言来生成性能测试的压力端。因此我把目光放在了现在的新秀Go。经过一段时间的学习,也写了一个小工具,记一下这两个语言的区别。
需求
工具是一个小爬虫,用来爬某网站的某个产品的迭代记录,实现逻辑就是运行脚本后,使用者从命令行输入某些元素(产品ID等)后,脚本导出一个Excel文件出来。
最初的版本是用Python写的,30行代码不到就搞定了。这次用Go重写,代码量在110行左右。
接受输入
第一步就是接受命令行的输入内容,工具要给非技术人员用的,弄一个CLI不太合适,要的效果就是一行一行的输入内容,用Python实现起来非常容易,像这样:
app_id = raw_input('请输入app_id: ') app_analysis = raw_input('请输入analysis: ')
执行后就是一行一行的往下走,但是用Go就有点蛋疼了,完整的代码如下:
func getPara() (string, string) { var i = 0 var appId, analysis string fmt.Print("请输入appId:") scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { text := scanner.Text() if i == 0 { appId = text fmt.Print("请输入analysis:") } else if i == 1 { analysis = text fmt.Print("程序初始化数据完毕。。。。请按任意键继续") } else { break } i++ } return appId, analysis }
Go要实现CLI很方便,但是涉及到这种一行一行的输入,要一直监听Scan(),所以就有了上面蛋疼的循环处理,而且在必须要先打印信息,再来监听内容,总体的写的过程很恶心,也许是没有找到更好的方法吧,实在是太逆天了。
发送请求
在发送请求方便,两种语言倒是差别不太大,至少我写的Get请求是这样的。
Python params = { "analysis": app_analysis, "appid": app_id, "country": 'cn' } r = requests.get(url, params)
Go q := req.URL.Query() q.Add("appid", appId) q.Add("analysis", analysis) q.Add("country", "cn") req.URL.RawQuery = q.Encode() var resp *http.Response resp, _ = http.DefaultClient.Do(req)
返回结果处理
在返回结果的处理上,Python的处理方式简直是太友好了,直接调用json就处理了。
result = r.json()
但是Go就有点蛋疼了,由于是静态语言,所以解包数据的时候需要先定义数据格式,比如返回的内容必须要先做如下的结构定义:
type ResultInfo struct { Code int Msg string Version []VersionInfo } type VersionInfo struct { Version string `json:"version"` ReleaseTime string `json:"release_time"` ReleaseNote string `json:"release_note"` AppName string `json:"app_name"` SubTitle string `json:"subtitle"` }
第一个ResultInfo是返回的数据,其中的Version也是一个数组对象,所以还要再定义一个数组对象,这样才能调用方法来解包处理。
body, _ := ioutil.ReadAll(resp.Body) var rst = ResultInfo{} if err := json.Unmarshal(body, &rst); err != nil { fmt.Println(err) }
写数据到Excel
这部分调用的都是第三方库,所以没什么可比性,代码的实现完全依赖于第三方包。
无所不在的err != nil
Go的异常捕获机制跟Python或者Java都不一样,Python的异常捕获使用的是try,except来包裹代码块,而Go用的是一个error对象,所以所有的Go代码都会充斥着大量的
if err != nil { return nil, err }
这种鬼东西,这种异常机制在阅读代码的时候,非常恶心,极大的影响了阅读体验。
吐槽完后
基本上从书写代码的过程来看,Python的编码效率比Go高出了很多很多,Go号称语法灵活,可以极大的提高编码效率,实际上并没有,受限于静态语言,相比于Python这种动态语言来说,编码效率的差距还是非常大的。只能说比其他静态语言编码效率高。
但是!!!
Go的效率比Python高了太多。举个例子,有一个计算斐波那契数的算法,Go的实现如下: func main() { const n = 40 starttime := time.Now() fibN := fib(n) endtime := time.Now() cost_time := endtime.Sub(starttime) fmt.Println(cost_time) fmt.Printf("\rFibonacci(%d) = %d\n", n, fibN) } func fib(x int) int { if x < 2 { return x } return fib(x-1) + fib(x-2) }
很简单的一个递归,当N为40的时候,Go花了大概1秒左右的时间,执行结果如下:
876.838ms(消耗时间) Fibonacci(40) = 102334155
我们换成Python
def fib(x): if x<2: return x return fib(x-1)+fib(x-2) if __name__ == '__main__': import time begin = time.time() print fib(40) end = time.time() print end-begin
一样的执行逻辑,执行的结果却是:
102334155 52.8657081127(消耗时间)
WTF!!! 用Go来处理效率是Python的50倍以上。
还没完,工具写完了总是要给人用的吧,Python写完之后,如果给一个非技术人员使用,那么。。。
使用者:要怎么用? 我:你装一下Python,然后配好环境变量,顺便把requests库和xlwt库也装一下。 我:要装这两个库你要先装一下pip。 使用者:黑人问号脸!!!!!
如果你用Go来写,打包完发过去就行了
使用者:要怎么用? 我:你双击一下,让你输入什么就输入什么
如果使用者是用Windows系统,那也没问题,
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build xxx.go
直接打包成exe文件
知识点扩展:
什么是Python?
Python是一种功能强大的高级编程语言,主要用于科学和工程计算。它是一种高效的语言,优雅务实,简单而强大,适合新手和专业人士的编程。
Python支持多种编程范例,并提出了一个大型标准库,包括面向对象,命令式,功能性和程序性。
Go是什么?
Go是一种通用编程语言,由Google设计;它借鉴了许多其他许多好主意语言,同时避免导致复杂性和不可靠代码的功能。
Go支持多范式,如程序,功能和并发。它的语法传统上来自C语言,但它已经做了很多修改,以改进简单性和安全性等功能。
go语言,python,区别
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】