You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python3.6(CPython)Windows下CPU密集型多线程为何快于单线程?

为什么CPython下CPU密集型任务的多线程版本比单线程更快?

在Windows 8核环境下使用Python 3.6(CPython解释器)测试GIL对多线程的影响,测试任务为CPU密集型计算,原本预期单线程版本比多线程版本更快,但实际结果相反。

测试代码

import time
import concurrent.futures

NUMBERS = [5000000 + x for x in range(20)]

def cpu_bound(number):
    return sum(i * i for i in range(number))


def find_sums(numbers):
    for number in numbers:
        cpu_bound(number)
        

def find_sums_threading(numbers):
    with concurrent.futures.ThreadPoolExecutor(max_workers=8) as executor:
        executor.map(cpu_bound, numbers)


def run():
    start_time = time.time()
    find_sums(NUMBERS)
    duration = time.time() - start_time
    print(f"Duration {duration} seconds")


def run_threading():
    start_time = time.time()
    find_sums_threading(NUMBERS)
    duration = time.time() - start_time
    print(f"Duration {duration} seconds")


run()
run_threading()

运行结果

Interpreter:  CPython
Single threaded: 15.699885129928589 seconds
Threading: 12.54316520690918 seconds

原因解释

  • 内置C函数会临时释放GIL:核心计算逻辑依赖的range()和sum()是C实现的内置函数,CPython中这类函数在执行核心计算时会主动释放GIL,让其他线程能获取GIL并在其他CPU核心上运行。多线程下多个任务的内置函数计算可并行进行,整体耗时被分摊。
  • 任务粒度与线程池配置匹配:测试用了20个独立计算任务,线程池设置8个工作线程,刚好匹配8核CPU资源。单线程串行执行所有任务,多线程可同时处理多个任务,结合GIL临时释放的特性,多个核心能同时参与计算,总耗时更短。
  • Python 3.2+的GIL调度优化:Python 3.2后对GIL调度机制做了改进,采用时间片调度,且C扩展函数执行时的GIL释放逻辑更高效,使得CPU密集型多线程在调用大量内置C函数的场景下,能获得实际并行收益,而非完全被GIL限制在单核心。

内容的提问来源于stack exchange,提问作者baopdh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 23:36:22