文档章节

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

大洋的顶端
 大洋的顶端
发布于 2017/03/20 02:10
字数 730
阅读 267
收藏 0

比如我们 从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负担,因此性能也比单线程提高很多。

 

© 著作权归作者所有

大洋的顶端
粉丝 17
博文 30
码字总数 13805
作品 0
广州
私信 提问
Python GIL 系列之再谈Python的GIL

1. 之前写过一篇《通过实例认识Python的GIL》的文章,感觉有些意犹未尽 2. 这次对例子作了些扩展,进一步的分析GIL对Python程序的影响 2.1 先来看例子: from threading import Thread from ...

神棍先生
2018/12/29
0
0
再见,Python!你好,Go语言

Go 语言诞生于谷歌,由计算机领域的三位宗师级大牛 Rob Pike、Ken Thompson 和 Robert Griesemer 写成。由于出身名门,Go 在诞生之初就吸引了大批开发者的关注。诞生十年以来,已经涌出了很多...

终端研发部
03/11
104
1
Ruby vs Golang:四个维度对比,谁更胜一筹?

软件应用程序的快速增长已经不再只是一件其本身受欢迎的事情了,它更是带来了深刻改善所有行业业务流程的真正机会。所以,对于企业、行业来说,通过合适的编程创建出出色的软件解决方案成为了...

局长
2018/08/15
6K
21
学习python最难的就是入门,而这文章刚好适合初学者!

Python可以应用于众多领域,如:数据分析、组件集成、网络服务、图像处理、数值计算和科学计算等众多领域。目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube、Dropbox、BT、Quo...

糖宝lsh
2018/10/11
88
0
Python 最难的问题

超过十年以上,没有比解释器全局锁(GIL)让Python新手和专家更有挫折感或者更有好奇心。 未解决的问题 随处都是问题。难度大、耗时多肯定是其中一个问题。仅仅是尝试解决这个问题就会让人惊...

oschina
2013/06/04
52.2K
42

没有更多内容

加载失败,请刷新页面

加载更多

全球第一时间响应:Rancher发布2.3.1,支持K8S CVE修复版本

北京时间2019年10月17日,Kubernetes发布了新的补丁版本,修复了新近发现的两个安全漏洞:CVE-2019-11253和CVE-2019-16276。Rancher第一时间响应,就在当天紧随其后发布了Rancher v2.3.1和R...

RancherLabs
4分钟前
1
0
EMQ X 规则引擎系列 (八)桥接消息到 MQTT Broker

桥接概念 桥接是一种连接多个 EMQ X 或者其他 MQTT 消息中间件的方式。不同于集群,工作在桥接模式下的节点之间不会复制主题树和路由表。桥接模式所做的是: 按照规则把消息转发至桥接节点;...

EMQX
7分钟前
3
0
《2019年上半年云上企业安全指南》详解安全建设最易忽视的问题!

《2019年上半年云上企业安全指南》是阿里云基于对云安全中心监测到的威胁情报进行分析,形成的一份云上企业安全建设指南。通过对云上企业安全建设现状及多维度威胁情报的分析,得出企业安全建...

开源中国小二
7分钟前
1
0
一天之际在于晨之KMP算法

(我觉得不需要明白原理,应该是在面试或者工作的时候,该想到用什么算法以及之后直接赋值我这里的代码就好了) 下面的情况我们第一时间考虑想到的是用KMP算法。 情况一:// ts字符串是否包...

木九天
10分钟前
1
0
如何通过反射机制创建对象?

// 获取类路径的完全限定名 String classname = "test.Interval"; // 通过类的完全限定名获取类对象 Class pClass = Class.forName(classname); // 通过类对象获取类的构造器对象 Constructo......

happywe
11分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部