Golang、python多线程非常典型例子,对照两门语言计算速度.

大洋的顶端 · · 2546 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

比如我们 从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  time
sum=0
ts=time.time()
for i in range (100000000):
    sum=sum+i
print('花费时间:(秒)  '+ str( time.time()-ts))

结算结果:

花费时间:(秒)  10.329591035842896

可以对照下,python的遍历计算能力有点弱,因为它属于脚本,每次生成一个对象,所以创建对象消耗的时间过高。

再写多线程,分段计算:

import threading
import time
ts=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=100000000
sliceLen=10
for 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负担,因此性能也比单线程提高很多。

 


有疑问加站长微信联系(非本文作者)

本文来自:开源中国博客

感谢作者:大洋的顶端

查看原文:Golang、python多线程非常典型例子,对照两门语言计算速度.

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2546 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传