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 相关文章推荐
以Flask为例讲解Python的框架的使用方法
Apr 29 Python
将Django框架和遗留的Web应用集成的方法
Jul 24 Python
Python操作Access数据库基本步骤分析
Sep 19 Python
Python实现一个转存纯真IP数据库的脚本分享
May 21 Python
django 按时间范围查询数据库实例代码
Feb 11 Python
python获取当前文件路径以及父文件路径的方法
Jul 10 Python
python中的列表与元组的使用
Aug 08 Python
基于keras输出中间层结果的2种实现方式
Jan 24 Python
Python实现自动访问网页的例子
Feb 21 Python
详解vscode实现远程linux服务器上Python开发
Nov 10 Python
使用Python下载抖音各大V视频的思路详解
Feb 06 Python
基于tensorflow权重文件的解读
May 26 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
Ajax+PHP边学边练 之五 图片处理
2009/12/03 PHP
PDO防注入原理分析以及使用PDO的注意事项总结
2014/10/23 PHP
Zend Framework连接Mysql数据库实例分析
2016/03/19 PHP
初学JavaScript第二章
2008/09/30 Javascript
简洁Ajax函数处理(示例代码)
2013/11/15 Javascript
javascript实现浏览器窗口传递参数的方法
2014/09/03 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形菜单
2015/11/30 Javascript
Javascript的动态增加类的实现方法
2016/10/20 Javascript
浅谈React前后端同构防止重复渲染
2018/01/05 Javascript
node.js中fs文件系统目录操作与文件信息操作
2018/02/24 Javascript
微信小程序云开发实现云数据库读写权限
2019/05/17 Javascript
原生JS使用Canvas实现拖拽式绘图功能
2019/06/05 Javascript
node.js实现上传文件功能
2019/07/15 Javascript
VUE项目初建和常见问题总结
2019/09/12 Javascript
微信小程序实现录音功能
2019/11/22 Javascript
[00:33]2016完美“圣”典风云人物:Sccc宣传片
2016/12/03 DOTA
Python random模块常用方法
2014/11/03 Python
Pycharm 设置自定义背景颜色的图文教程
2018/05/23 Python
TensorFlow 模型载入方法汇总(小结)
2018/06/19 Python
Python Excel处理库openpyxl使用详解
2019/05/09 Python
Python3.5 + sklearn利用SVM自动识别字母验证码方法示例
2019/05/10 Python
python单例模式原理与创建方法实例分析
2019/10/26 Python
Django 后台带有字典的列表数据与页面js交互实例
2020/04/03 Python
美国时尚大码女装购物网站:Avenue
2019/05/24 全球购物
数控专业推荐信范文
2013/12/02 职场文书
商务主管岗位职责
2013/12/08 职场文书
创业计划书中要认真思考的问题
2013/12/28 职场文书
房地产销售经理岗位职责
2014/01/01 职场文书
学生出入校管理制度
2014/01/16 职场文书
《月迹》教学反思
2014/02/19 职场文书
主题党日活动总结
2014/07/08 职场文书
群众路线四风问题整改措施
2014/09/27 职场文书
会计工作检讨书
2015/02/19 职场文书
2015年学校团委工作总结
2015/05/26 职场文书
幽默口才训练经典句子(48句)
2019/08/19 职场文书
python读取并查看npz/npy文件数据以及数据显示方法
2022/04/14 Python