np.linalg.inv是否持有GIL?多线程无加速反而变慢问题咨询
为什么np.linalg.inv在Python多线程下无法加速?
我了解大多数NumPy操作会释放GIL,因此在Python多线程环境下能获得预期的加速效果,但发现np.linalg.inv并非如此。
实验
我进行了如下实验:
import numpy as np import time from concurrent.futures import ThreadPoolExecutor def numpy_op(arr): # 执行矩阵求逆 return np.linalg.inv(arr) num_workers = 8 np.random.seed(42) args = [np.random.randn(10000, 10000) for _ in range(num_workers)] # 线程池并行执行 s_time = time.time() with ThreadPoolExecutor(max_workers=num_workers) as executor: res = list(executor.map(numpy_op, args)) # 串行执行 res = [] for arg in args: res.append(numpy_op(arg)) print(f'耗时: {time.time()-s_time:.2f}s')
结果
- 多线程:36.44s
- 串行:28.14s
但如果换成其他NumPy操作,比如:
def numpy_op(arr): # 一些普通NumPy运算 return (arr**2 + 2) ** 0.5
结果
- 多线程:0.62s
- 串行:3.71s
版本信息
使用的版本为Python 3.9.10和NumPy 1.24.3
内容的提问来源于stack exchange,提问作者noah0822
相关产品推荐
相关产品推荐

