python和go语言的区别是什么


Posted in Python onJuly 20, 2020

背景

工作中的主力语言是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语言,但它已经做了很多修改,以改进简单性和安全性等功能。

到此这篇关于python和go语言的区别是什么的文章就介绍到这了,更多相关go语言和python有什么区别内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python实现无证书加密解密实例
Oct 27 Python
Python常用内置模块之xml模块(详解)
May 23 Python
Python实现求笛卡尔乘积的方法
Sep 16 Python
python3+PyQt5图形项的自定义和交互 python3实现page Designer应用程序
Jul 20 Python
浅谈Django中的数据库模型类-models.py(一对一的关系)
May 30 Python
python递归全排列实现方法
Aug 18 Python
pycharm运行程序时在Python console窗口中运行的方法
Dec 03 Python
python保留小数位的三种实现方法
Jan 07 Python
tensorboard实现同时显示训练曲线和测试曲线
Jan 21 Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
Feb 25 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
Feb 29 Python
3种适用于Python的疯狂秘密武器及原因解析
Apr 29 Python
Python基础教程(一)——Windows搭建开发Python开发环境
Jul 20 #Python
Python字典fromkeys()方法使用代码实例
Jul 20 #Python
Python爬虫设置ip代理过程解析
Jul 20 #Python
Python如何使用27行代码绘制星星图
Jul 20 #Python
tensorflow基于CNN实战mnist手写识别(小白必看)
Jul 20 #Python
基于python实现生成指定大小txt文档
Jul 20 #Python
python中upper是做什么用的
Jul 20 #Python
You might like
德劲1103的维修打理经验
2021/03/02 无线电
PHP CURL post数据报错 failed creating formpost data
2016/10/16 PHP
基于jquery的气泡提示效果
2010/05/31 Javascript
JQuery each打印JS对象的方法
2013/11/13 Javascript
jqgrid 表格数据导出实例
2013/11/21 Javascript
利用jquery写的左右轮播图特效
2014/02/12 Javascript
js Object2String方便查看js对象内容
2014/11/24 Javascript
JS实现pasteHTML兼容ie,firefox,chrome的方法
2016/06/22 Javascript
JavaScript无阻塞加载和defer、async详解
2017/02/26 Javascript
EasyUI中的dataGrid的行内编辑
2017/06/22 Javascript
BootStrap模态框闪退问题实例代码详解
2018/12/10 Javascript
微信小程序使用蓝牙小插件
2019/09/23 Javascript
JavaScript交换变量的常用方法小结【4种方法】
2020/05/07 Javascript
python实现的DES加密算法和3DES加密算法实例
2015/06/03 Python
python清除字符串里非数字字符的方法
2015/07/02 Python
在Django的通用视图中处理Context的方法
2015/07/21 Python
Python机器学习之SVM支持向量机
2017/12/27 Python
python实现梯度下降算法
2020/03/24 Python
对python中字典keys,values,items的使用详解
2019/02/03 Python
Python操作rabbitMQ的示例代码
2019/03/19 Python
Python批量处理csv并保存过程解析
2020/05/16 Python
PHP中如何使用Cookie
2015/10/28 面试题
请写出 BOOL flag 与"零值"比较的 if 语句
2016/02/29 面试题
学生会竞选自荐信
2013/10/12 职场文书
电脑教师的教学自我评价
2013/11/26 职场文书
中学生自我评价范文
2014/02/08 职场文书
创建市级文明单位实施方案
2014/03/01 职场文书
党员干部2014全国两会学习心得体会
2014/03/10 职场文书
护校行动方案
2014/05/31 职场文书
广告设计专业毕业生自我鉴定
2014/09/27 职场文书
爱心募捐感谢信
2015/01/22 职场文书
2015年“七七卢沟桥事变”纪念活动总结
2015/03/24 职场文书
高考1977观后感
2015/06/04 职场文书
公司规章制度范本
2015/08/03 职场文书
goland 设置project gopath的操作
2021/05/06 Golang
Pygame Draw绘图函数的具体使用
2021/11/17 Python