首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >尽管存在GIL,多线程仍可加速CPU密集型任务

尽管存在GIL,多线程仍可加速CPU密集型任务
EN

Stack Overflow用户
提问于 2020-08-10 11:50:58
回答 1查看 65关注 0票数 2

我最近了解了python中的GIL。我做了一些基准测试,发现多线程确实提高了性能。我比较了不使用任何内部多线程的基于元素的NumPy操作。在第一个测试中,我从for循环中连续调用函数32次。在第二种情况下,我使用多线程。但如果GIL正在工作,在第二种情况下,一次应该只有一个线程处于活动状态,因此执行时间应该大致相等(在第二种情况下,由于多线程开销,情况会更糟)。这不是我所观察到的。

代码语言:javascript
运行
复制
import os
import threading
import numpy as np, time

def elemntwiseoperations(a,b):
    np.exp(a)+np.sin(b)
        
N=1024
a=np.random.rand(N,N)
b=np.random.rand(N,N)


NoTasks=32

start_time = time.time()
for i in range(NoTasks):
    elemntwiseoperations(a,b)
print("Execution time for {} tasks: {} seconds, {} seconds per task".format(NoTasks,time.time() - start_time,(time.time() - start_time)/NoTasks))

threads=[]
start_time = time.time()
for i in range(NoTasks):
    x = threading.Thread(target=elemntwiseoperations,name=''.format(i),args=(a,b))
    x.start()
    threads.append(x)
    
for process in threads:
    process.join()

print("Execution time for {} tasks: {} seconds, {} seconds per task".format(NoTasks,time.time() - start_time,(time.time() - start_time)/NoTasks))

输出:

代码语言:javascript
运行
复制
Execution time for 32 tasks: 0.5654711723327637 seconds, 0.01767103374004364 seconds per task
Execution time for 32 tasks: 0.17153215408325195 seconds, 0.005360409617424011 seconds per task

P.S. MAC os,python 3.7.6,Cpython实现。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-10 22:25:44

因此,我目前最好的猜测是:在第一种情况下,一个线程按顺序启动C例程。它等待每一个都完成,然后才开始新的一个。因为我只使用了在numpy中没有并行化的元素级操作,所以在整个过程中只涉及一个线程。

在第二种情况下,我调用了32个虚拟线程,每个线程都受到GIL的影响。第一个线程启动C例程并将GIL控制权交给第二个线程,第二个线程启动C例程并将控制权交给第三个线程,依此类推。尽管C例程不是同时调用的,但它们都是并发执行的,因为C不受GIL的影响。

我不知道如何检查它,但这是我在读了几篇关于GIL的python博客后对它的理解。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63333899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档