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 中整型对象的存储问题
May 16 Python
python+matplotlib实现动态绘制图片实例代码(交互式绘图)
Jan 20 Python
PyQt5每天必学之布局管理
Apr 19 Python
Python运维之获取系统CPU信息的实现方法
Jun 11 Python
python 读取竖线分隔符的文本方法
Dec 20 Python
python实现石头剪刀布小游戏
Jan 20 Python
Django框架自定义session处理操作示例
May 27 Python
python+opencv实现摄像头调用的方法
Jun 22 Python
pytorch 共享参数的示例
Aug 17 Python
浅析Python 抽象工厂模式的优缺点
Jul 13 Python
Django REST framework 限流功能的使用
Jun 24 Python
利用Python将list列表写入文件并读取的方法汇总
Mar 25 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
PHP 巧用数组降低程序的时间复杂度
2010/01/01 PHP
利用yahoo汇率接口实现实时汇率转换示例 汇率转换器
2014/01/14 PHP
laravel学习笔记之模型事件的几种用法示例
2017/08/15 PHP
php实现的生成排列算法示例
2019/07/25 PHP
js getElementsByTagName的简写方式
2010/06/27 Javascript
js截取固定长度的中英文字符的简单实例
2013/11/22 Javascript
jQuery自动完成插件completer附源码下载
2016/01/04 Javascript
浅析Bootstrap缩略图组件与警示框组件
2016/04/29 Javascript
浅析Bootstrip的select控件绑定数据的问题
2016/05/10 Javascript
jQuery使用deferreds串行多个ajax请求
2016/08/22 Javascript
canvas实现绘制吃豆鱼效果
2017/01/12 Javascript
详解微信小程序Radio选中样式切换
2017/07/06 Javascript
Bootstrap 实现表格样式、表单布局的实例代码
2018/12/09 Javascript
vue props对象validator自定义函数实例
2019/11/13 Javascript
JS实现滑动拼图验证功能完整示例
2020/03/29 Javascript
javascript自定义加载loading效果
2020/09/15 Javascript
python list 合并连接字符串的方法
2013/03/09 Python
tornado捕获和处理404错误的方法
2014/02/26 Python
python中二维阵列的变换实例
2014/10/09 Python
讲解Python中for循环下的索引变量的作用域
2015/04/15 Python
matplotlib 纵坐标轴显示数据值的实例
2018/05/25 Python
Python实现的读取/更改/写入xml文件操作示例
2018/08/30 Python
django 通过URL访问上传的文件方法
2019/07/28 Python
tensorflow使用range_input_producer多线程读取数据实例
2020/01/20 Python
django有外键关系的两张表如何相互查找
2020/02/10 Python
Python如何实现的二分查找算法
2020/05/27 Python
python 密码学示例——理解哈希(Hash)算法
2020/09/21 Python
HTML5微信播放全屏问题的解决方法
2017/03/09 HTML / CSS
德国最大的设计师鞋网上商店:Budapester
2017/12/07 全球购物
Desigual德国官网:在线购买原创服装
2018/03/27 全球购物
加拿大的标志性百货公司:Hudson’s Bay(哈得逊湾)
2019/09/03 全球购物
函数只定义了一次, 调用了一次, 但编译器提示非法重定义了-什么问题?
2014/10/03 面试题
《庐山的云雾》教学反思
2014/04/22 职场文书
发展党员工作情况汇报
2014/10/28 职场文书
党员教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
行政文员岗位职责
2015/02/04 职场文书