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的几种开发工具介绍
Mar 07 Python
python爬虫入门教程--HTML文本的解析库BeautifulSoup(四)
May 25 Python
python中lambda()的用法
Nov 16 Python
使用pandas将numpy中的数组数据保存到csv文件的方法
Jun 14 Python
详解python中的json和字典dict
Jun 22 Python
浅谈python中真正关闭socket的方法
Dec 18 Python
PyCharm 创建指定版本的 Django(超详图解教程)
Jun 18 Python
Mac在python3环境下安装virtualwrapper遇到的问题及解决方法
Jul 09 Python
Python使用matplotlib绘制Logistic曲线操作示例
Nov 28 Python
Python class的继承方法代码实例
Feb 14 Python
python怎么对数字进行过滤
Jul 05 Python
Python趣味挑战之实现简易版音乐播放器
May 28 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
linux php mysql数据库备份实现代码
2009/03/10 PHP
PHP使用imagick读取PDF生成png缩略图的两种方法
2014/03/20 PHP
PHP版微信第三方实现一键登录及获取用户信息的方法
2016/10/14 PHP
PHP内置函数生成随机数实例
2019/01/18 PHP
js TextArea的选中区域处理
2010/12/28 Javascript
IE浏览器IFrame对象内存不释放问题解决方法
2014/08/22 Javascript
JS实现仿google、百度搜索框输入信息智能提示的实现方法
2015/04/20 Javascript
让你一句话理解闭包(简单易懂)
2016/06/03 Javascript
ionic实现可滑动的tab选项卡切换效果
2020/04/15 Javascript
node.js调用Chrome浏览器打开链接地址的方法
2017/05/17 Javascript
让Vue也可以使用Redux的方法
2018/05/23 Javascript
Vue中的作用域CSS和CSS模块的区别
2018/10/09 Javascript
关于Vue Router中路由守卫的应用及在全局导航守卫中检查元字段的方法
2018/12/09 Javascript
详解微信小程序开发之formId使用(模板消息)
2019/08/27 Javascript
vue中axios防止多次触发终止多次请求的示例代码(防抖)
2020/02/16 Javascript
Vuex实现购物车小功能
2020/08/17 Javascript
JavaScript Blob对象原理及用法详解
2020/10/14 Javascript
Python操作sqlite3快速、安全插入数据(防注入)的实例
2014/04/26 Python
python列表生成式与列表生成器的使用
2018/02/23 Python
详解python分布式进程
2018/10/08 Python
opencv3/C++图像像素操作详解
2019/12/10 Python
TensorFlow基本的常量、变量和运算操作详解
2020/02/03 Python
Python偏函数实现原理及应用
2020/11/20 Python
python Scrapy爬虫框架的使用
2021/01/21 Python
HTML5 本地存储实现购物车功能
2017/09/07 HTML / CSS
生物化工工艺专业应届生求职信
2013/10/08 职场文书
教你打造完美的创业计划书
2014/01/06 职场文书
服装促销活动方案
2014/02/23 职场文书
初中家长寄语
2014/04/02 职场文书
大学生英语演讲稿
2014/04/24 职场文书
踏青活动策划方案
2014/08/19 职场文书
2014乡镇领导班子四风对照检查材料思想汇报
2014/10/05 职场文书
领导离职感言
2015/08/03 职场文书
CSS实现多个元素在盒子内两端对齐效果
2021/03/30 HTML / CSS
go开发alertmanger实现钉钉报警
2021/07/16 Golang
Python如何让字典保持有序排列
2022/04/29 Python