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使用自定义user-agent抓取网页的方法
Apr 15 Python
R vs. Python 数据分析中谁与争锋?
Oct 18 Python
tensorflow入门之训练简单的神经网络方法
Feb 26 Python
pandas获取groupby分组里最大值所在的行方法
Apr 20 Python
使用python的pandas库读取csv文件保存至mysql数据库
Aug 20 Python
Python Pandas批量读取csv文件到dataframe的方法
Oct 08 Python
Python爬虫实现获取动态gif格式搞笑图片的方法示例
Dec 24 Python
django解决跨域请求的问题详解
Jan 20 Python
对pandas通过索引提取dataframe的行方法详解
Feb 01 Python
基于python实现ROC曲线绘制广场解析
Jun 28 Python
分享几种python 变量合并方法
Mar 20 Python
Python使用华为API为图像设置多个锚点标签
Apr 12 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 无限级数据JSON格式及JS解析
2010/07/17 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
2020/03/23 PHP
jQuery中fadeIn、fadeOut、fadeTo的使用方法(图片显示与隐藏)
2013/05/08 Javascript
JS验证邮箱格式是否正确的代码
2013/12/05 Javascript
浅析JavaScript中的同名标识符优先级
2013/12/06 Javascript
jquery基础教程之数组使用详解
2014/03/10 Javascript
使用Node.js为其他程序编写扩展的基本方法
2015/06/23 Javascript
Javascript将双字节字符转换成单字节字符并计算长度
2016/06/22 Javascript
bootstrapfileinput实现文件自动上传
2016/11/08 Javascript
jquery——九宫格大转盘抽奖实例
2017/01/16 Javascript
Ajax异步获取html数据中包含js方法无效的解决方法
2017/02/20 Javascript
微信小程序的分类页面制作
2017/06/27 Javascript
Webpack常见静态资源处理-模块加载器(Loaders)+ExtractTextPlugin插件
2017/06/29 Javascript
详解vue-router 路由元信息
2017/09/13 Javascript
JS中的事件委托实例浅析
2018/03/22 Javascript
webpack打包nodejs项目的方法
2018/09/26 NodeJs
详解nodejs 配置文件处理方案
2019/01/02 NodeJs
JS学习笔记之原型链和利用原型实现继承详解
2019/05/29 Javascript
javascript 构建模块化开发过程解析
2019/09/11 Javascript
解决vuecli3中img src 的引入问题
2020/08/04 Javascript
微信小程序实现页面左右滑动
2020/11/16 Javascript
使用Python3制作TCP端口扫描器
2017/04/17 Python
Java分治归并排序算法实例详解
2017/12/12 Python
对python 中class与变量的使用方法详解
2019/06/26 Python
利用OpenCV和Python实现查找图片差异
2019/12/19 Python
Python openpyxl模块原理及用法解析
2020/01/19 Python
Python实现列表索引批量删除的5种方法
2020/11/16 Python
StubHub希腊:购买体育赛事、音乐会和剧院门票
2019/08/03 全球购物
幼儿园庆六一游园活动方案
2014/01/29 职场文书
公司开业庆典策划方案
2014/06/04 职场文书
党员批评与自我批评
2014/10/15 职场文书
2014年组织委员工作总结
2014/12/01 职场文书
2014年出纳工作总结与计划
2014/12/09 职场文书
求职推荐信范文
2015/03/27 职场文书
提升Nginx性能的一些建议
2021/03/31 Servers