python单进程能否利用多核cpu的测试结论
admin
2023-07-31 00:38:33
0

在很早的时候,就听网上的文章说:

python有GIL,所以在单进程内,即使使用多线程也无法利用到多核的优势,同一时刻,python的字节码只会运行在一个cpu上。

以前也是奉为真理,直到今天在对自己的python server做性能测试的时候,发现一个python进程的cpu居然达到了120%。

当用c++编程的时候,如果使用多线程,那么确实进程cpu超过100%非常正常,但是对python来说,似乎这样就和网上的文章冲突了。

所以还是决定自己亲身试验一下,编写代码如下:

1234567891011 from thread import start_new_thread def worker():    while 1:        #print 1        pass for it in range(0, 15):    start_new_thread(worker, ()) raw_input()

 

运行环境为: centos6.4 64位, python 2.7.

得到的结果如下:

E588C2D7 1608 42CC B800 AD5338C87F47

可以清楚的看到,pid为31199的python进程cpu达到了787.9%,接近理论能达到的最大值 800%。

而上方的8个cpu也分别达到了近100%的利用率。

 

如果只是按照以上测试结果,确实可以得出的结论:python使用单进程,多线程确实能够使用到多核cpu,并不是网上传的结论。

但是,还是希望如果有读者对这块有更深入的研究能够进行批评指正,谢谢~


8月15日补充

感谢 la.onger 等几位博友的讨论,现在增加一个测试,用来测试纯cpu计算用一个线程or多个线程完成的总时间的差别,代码如下:

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 import timefrom threading import Thread LOOPS = 1000000THREAD_NUM = 10STEP_SIZE = 94753434 class Test(object):    num = 1     def work(self):        for it in xrange(0, LOOPS):            if self.num > STEP_SIZE:                self.num -= STEP_SIZE            else:                self.num += STEP_SIZE     def one_thread_test(self):        self.num = 1         begin_time = time.time()         for v in xrange(0, THREAD_NUM):            self.work()         print \’time passed: \’, time.time() begin_time     def multi_thread_test(self):        self.num = 1         t_list = []         begin_time = time.time()         for v in xrange(0, THREAD_NUM):            t = Thread(target=self.work)            t.start()            t_list.append(t)         for it in t_list:            it.join()         print \’time passed: \’, time.time() begin_time t = Test()t.one_thread_test()t.multi_thread_test()

输入结果如下:

12 time passed:  3.44264101982time passed:  7.22910785675

使用多线程后,比不用多线程还慢

为了与c++版做对比,也开发了c++代码如下:

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...