最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python和go語言的區(qū)別是什么

 更新時(shí)間:2020年07月20日 10:09:39   作者:流芳  
在本篇文章中小編給大家整理的是一篇關(guān)于go語言和python的區(qū)別點(diǎn),需要的朋友們可以學(xué)習(xí)下。

背景

工作中的主力語言是Python,今年要搞性能測試的工具,由于GIL鎖的原因,Python的性能實(shí)在是慘淡,需要學(xué)一門性能高的語言來生成性能測試的壓力端。因此我把目光放在了現(xiàn)在的新秀Go。經(jīng)過一段時(shí)間的學(xué)習(xí),也寫了一個(gè)小工具,記一下這兩個(gè)語言的區(qū)別。

需求

工具是一個(gè)小爬蟲,用來爬某網(wǎng)站的某個(gè)產(chǎn)品的迭代記錄,實(shí)現(xiàn)邏輯就是運(yùn)行腳本后,使用者從命令行輸入某些元素(產(chǎn)品ID等)后,腳本導(dǎo)出一個(gè)Excel文件出來。

最初的版本是用Python寫的,30行代碼不到就搞定了。這次用Go重寫,代碼量在110行左右。

接受輸入

第一步就是接受命令行的輸入內(nèi)容,工具要給非技術(shù)人員用的,弄一個(gè)CLI不太合適,要的效果就是一行一行的輸入內(nèi)容,用Python實(shí)現(xiàn)起來非常容易,像這樣:

app_id = raw_input('請輸入app_id: ')
app_analysis = raw_input('請輸入analysis: ')

執(zhí)行后就是一行一行的往下走,但是用Go就有點(diǎn)蛋疼了,完整的代碼如下:

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("程序初始化數(shù)據(jù)完畢。。。。請按任意鍵繼續(xù)")
    } else {
      break
    }
    i++
  }
  return appId, analysis
}

Go要實(shí)現(xiàn)CLI很方便,但是涉及到這種一行一行的輸入,要一直監(jiān)聽Scan(),所以就有了上面蛋疼的循環(huán)處理,而且在必須要先打印信息,再來監(jiān)聽內(nèi)容,總體的寫的過程很惡心,也許是沒有找到更好的方法吧,實(shí)在是太逆天了。

發(fā)送請求

在發(fā)送請求方便,兩種語言倒是差別不太大,至少我寫的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)

返回結(jié)果處理

在返回結(jié)果的處理上,Python的處理方式簡直是太友好了,直接調(diào)用json就處理了。

result = r.json()

但是Go就有點(diǎn)蛋疼了,由于是靜態(tài)語言,所以解包數(shù)據(jù)的時(shí)候需要先定義數(shù)據(jù)格式,比如返回的內(nèi)容必須要先做如下的結(jié)構(gòu)定義:

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"`
}

第一個(gè)ResultInfo是返回的數(shù)據(jù),其中的Version也是一個(gè)數(shù)組對象,所以還要再定義一個(gè)數(shù)組對象,這樣才能調(diào)用方法來解包處理。

body, _ := ioutil.ReadAll(resp.Body)
var rst = ResultInfo{}
if err := json.Unmarshal(body, &rst); err != nil {
  fmt.Println(err)
}

寫數(shù)據(jù)到Excel

這部分調(diào)用的都是第三方庫,所以沒什么可比性,代碼的實(shí)現(xiàn)完全依賴于第三方包。

無所不在的err != nil

Go的異常捕獲機(jī)制跟Python或者Java都不一樣,Python的異常捕獲使用的是try,except來包裹代碼塊,而Go用的是一個(gè)error對象,所以所有的Go代碼都會(huì)充斥著大量的

if err != nil {
    return nil, err
  }

這種鬼東西,這種異常機(jī)制在閱讀代碼的時(shí)候,非常惡心,極大的影響了閱讀體驗(yàn)。

吐槽完后

基本上從書寫代碼的過程來看,Python的編碼效率比Go高出了很多很多,Go號(hào)稱語法靈活,可以極大的提高編碼效率,實(shí)際上并沒有,受限于靜態(tài)語言,相比于Python這種動(dòng)態(tài)語言來說,編碼效率的差距還是非常大的。只能說比其他靜態(tài)語言編碼效率高。

但是?。?!

Go的效率比Python高了太多。舉個(gè)例子,有一個(gè)計(jì)算斐波那契數(shù)的算法,Go的實(shí)現(xiàn)如下:
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)
}

很簡單的一個(gè)遞歸,當(dāng)N為40的時(shí)候,Go花了大概1秒左右的時(shí)間,執(zhí)行結(jié)果如下:

876.838ms(消耗時(shí)間)
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

一樣的執(zhí)行邏輯,執(zhí)行的結(jié)果卻是:

102334155
52.8657081127(消耗時(shí)間)

WTF!!! 用Go來處理效率是Python的50倍以上。

還沒完,工具寫完了總是要給人用的吧,Python寫完之后,如果給一個(gè)非技術(shù)人員使用,那么。。。

使用者:要怎么用?
我:你裝一下Python,然后配好環(huán)境變量,順便把requests庫和xlwt庫也裝一下。
我:要裝這兩個(gè)庫你要先裝一下pip。
使用者:黑人問號(hào)臉!?。。?!

如果你用Go來寫,打包完發(fā)過去就行了

使用者:要怎么用?
我:你雙擊一下,讓你輸入什么就輸入什么

如果使用者是用Windows系統(tǒng),那也沒問題,

CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build xxx.go

直接打包成exe文件

知識(shí)點(diǎn)擴(kuò)展:

什么是Python?

Python是一種功能強(qiáng)大的高級(jí)編程語言,主要用于科學(xué)和工程計(jì)算。它是一種高效的語言,優(yōu)雅務(wù)實(shí),簡單而強(qiáng)大,適合新手和專業(yè)人士的編程。

Python支持多種編程范例,并提出了一個(gè)大型標(biāo)準(zhǔn)庫,包括面向?qū)ο?,命令式,功能性和程序性?/p>

Go是什么?

Go是一種通用編程語言,由Google設(shè)計(jì);它借鑒了許多其他許多好主意語言,同時(shí)避免導(dǎo)致復(fù)雜性和不可靠代碼的功能。

Go支持多范式,如程序,功能和并發(fā)。它的語法傳統(tǒng)上來自C語言,但它已經(jīng)做了很多修改,以改進(jìn)簡單性和安全性等功能。

到此這篇關(guān)于python和go語言的區(qū)別是什么的文章就介紹到這了,更多相關(guān)go語言和python有什么區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入了解Django View(視圖系統(tǒng))

    深入了解Django View(視圖系統(tǒng))

    這篇文章主要介紹了簡單了解Django View(視圖系統(tǒng)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Python中用xlwt制作表格實(shí)例講解

    Python中用xlwt制作表格實(shí)例講解

    在本篇文章里小編給大家整理的是一篇關(guān)于Python中用xlwt制作表格實(shí)例講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-11-11
  • python獲取array中指定元素的示例

    python獲取array中指定元素的示例

    今天小編就為大家分享一篇python獲取array中指定元素的示例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • python如何獲取apk的packagename和activity

    python如何獲取apk的packagename和activity

    這篇文章主要介紹了python如何獲取apk的packagename和activity,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Python爬蟲必備技巧詳細(xì)總結(jié)

    Python爬蟲必備技巧詳細(xì)總結(jié)

    本篇文章介紹了我在爬蟲過程中總結(jié)的幾個(gè)必備技巧,都是經(jīng)過實(shí)驗(yàn)的,通讀本篇對大家的學(xué)習(xí)或工作具有一定的價(jià)值,需要的朋友可以參考下
    2021-10-10
  • Python之ThreadPoolExecutor線程池問題

    Python之ThreadPoolExecutor線程池問題

    這篇文章主要介紹了Python之ThreadPoolExecutor線程池問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Python進(jìn)制轉(zhuǎn)換與反匯編實(shí)現(xiàn)流程介紹

    Python進(jìn)制轉(zhuǎn)換與反匯編實(shí)現(xiàn)流程介紹

    這篇文章主要介紹了Python進(jìn)制轉(zhuǎn)換與反匯編的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-10-10
  • 詳解Python中datetime庫的使用

    詳解Python中datetime庫的使用

    這篇文章主要介紹了Python中datetime庫的使用,它提供了一系列由簡單到復(fù)雜的時(shí)間處理方法。datetime 庫可以從系統(tǒng)中獲得時(shí)間,并以用戶選擇的格式輸出,需要的朋友可以參考下
    2023-04-04
  • python控制結(jié)構(gòu)的條件判斷與循環(huán)示例詳解

    python控制結(jié)構(gòu)的條件判斷與循環(huán)示例詳解

    這篇文章主要為大家介紹了python控制結(jié)構(gòu)的條件判斷與循環(huán)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Python 類變量和實(shí)例變量的實(shí)現(xiàn)與區(qū)別(附示例)

    Python 類變量和實(shí)例變量的實(shí)現(xiàn)與區(qū)別(附示例)

    本文主要介紹了Python 類變量和實(shí)例變量的實(shí)現(xiàn)與區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03

最新評(píng)論

霍林郭勒市| 庆元县| 从化市| 长沙市| 深水埗区| 瓦房店市| 新安县| 雅安市| 耒阳市| 巴彦淖尔市| 昭苏县| 桦南县| 东光县| 卓尼县| 梅河口市| 晋中市| 榆林市| 永嘉县| 九江市| 琼中| 新巴尔虎左旗| 濮阳县| 平潭县| 额尔古纳市| 广州市| 淮北市| 聊城市| 酉阳| 东山县| 武邑县| 驻马店市| 奈曼旗| 济源市| 共和县| 富锦市| 淮北市| 衡山县| 年辖:市辖区| 新泰市| 宜州市| 全州县|