【发布时间】:2020-08-10 03:50:58
【问题描述】:
我最近了解了 Python 中的 GIL。 我正在做一些基准测试,发现多线程实际上确实提高了性能。我比较了不使用任何内部多线程的元素 NumPy 操作。在第一个测试中,我从 for 循环中依次调用了一个函数 32 次。在第二种情况下,我使用多线程。但是如果 GIL 正在工作,在第二种情况下,一次应该只有 1 个线程处于活动状态,因此执行时间应该大致相等(由于多线程开销,在第二种情况下甚至更糟)。这不是我观察到的。
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))
输出:
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
附: MAC os,python 3.7.6,Cpython 实现。
【问题讨论】:
-
请记住,GIL 仅适用于 Python 字节码的解释。用 C 实现的代码可以(可选地)在没有 GIL 锁定的情况下运行,并且 NumPy 的 CPU 密集型操作很可能在 C 中实现,因此能够彼此并行运行。
-
@JeremyFriesner 感谢您的提示。我以我理解的方式发布了答案,但我不知道如何检查我所理解的是否真的是真的
标签: python multithreading gil