Golang、python多線程非常典型例子,對照兩門語言計算速度.

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

比如我們 從1加到100,我們小時候就知道 101*50=5050,這是利用了演算法,但是我們這裡沒有討論演算法,只是驗證電腦的計算能力,在GO語言中,我們這樣設計遍曆。

func main() {   ts := time.Now().UnixNano()   h := 1000000000   sum := 0   for i := 0; i <= h; i++ {      sum = sum + i   }   fmt.Println(sum)   fmt.Print("時間毫秒:")   fmt.Println((time.Now().UnixNano() - ts) / 1000000)}

計算結果:

500000000500000000

時間毫秒:289

這樣單線程計算的話,浪費了電腦的多核效能,而且GO的並發就是利用多核,因此我們開闢幾個線程,每個線程計算一段,比如我們要計算1到100等於多少,就可以開闢10個線程,分別計算1-10,10-20等等。

func Count1(start int, end int, ch chan int) {   var cccc int   for j := start; j < end; j++ {      cccc = cccc + j   }   ch <- cccc}func main() {   ts := time.Now().UnixNano()   h := 1000000000   sum := 0   ch := make(chan int, 50)   numLength := cap(ch)   for i := 0; i < numLength; i++ {      num := h / numLength      go Count1(num*i, num*i+num, ch)   }   for i := 0; i < numLength; i++ {      select {      case msg := <-ch:         sum = sum + msg      }   }   fmt.Println(sum + h)   fmt.Print("時間毫秒:")   fmt.Println((time.Now().UnixNano() - ts) / 1000000)}

計算結果:

500000000500000000

時間毫秒:75

可以對比一下,效率提高了4-5倍,因此我們可以推斷,我在網吧用的電腦的cpu核心數大約在4-8核之間,CPU核心數一般是2的次方計算,而且系統不會把CPU的計算能力全部分配我的程式,所以8核最為可靠,(自己沒有電腦,也買不起,在這裡上網6元一個小時,沖100送100,屬於電競區,還可以接受,其他的區間4元一小時),其實也可以看到並沒有完全利用8核全部效能,因為這是系統原因。

看下python

先寫個單線程的列子:這次計算100000000,注意這比上面的GO語言計算數目少了一個0。

import  timesum=0ts=time.time()for i in range (100000000):    sum=sum+iprint('花費時間:(秒)  '+ str( time.time()-ts))

結算結果:

花費時間:(秒)  10.329591035842896

可以對照下,python的遍曆計算能力有點弱,因為它屬於指令碼,每次產生一個對象,所以建立對象消耗的時間過高。

再寫多線程,分段計算:

import threadingimport timets=time.time()mutex = threading.Lock()sumList=[]def Count(start,end):    count=0    for i in range(start,end):        count = count + i    mutex.acquire()    sumList.append(int(count))    mutex.release()li = []h=100000000sliceLen=10for i in range(sliceLen):    num = int (h / sliceLen)    th = threading.Thread(target=Count, args=(num*i,num*i+num))    th.start()    li.append(th)for i in li:     i.join()print(sum(sumList)+h)print('花費時間:(秒)  '+ str( time.time()-ts))

花費時間:(秒)  6.120349884033203

可以看到PYTHON中並沒有真正完全利用多核性,由於GIL的限制,並沒有真正利用多核來計算,不過由於分擔了一些其他的工作,減少了主CPU負擔,因此效能也比單線程提高很多。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.