cPython 是否使用多个内核来实现排序、任意、全部等内置函数?

Does cPython use multiple cores for built-in functions such as sort, any, all?

我知道 cPython 有一个 GIL,因此如果不使用多处理模块,您的脚本就无法 运行 在多个内核上运行。但是有什么可以阻止内置功能,例如使用多核进行排序吗?我不了解 cPython 结构,但我认为我要问的问题是“内置函数,如 sort、any 和 list comprehensions 实际上在 GIL 之下吗?

cPython GIL 只允许单个线程在一个进程中处理 运行 字节码——它与非抽象的 CPU 无关。

也就是说,截至目前,除非您正在向 fork/use 多个进程调用某些内容,或者您​​的 OS/hardware 正在接听电话并为您执行此操作(极不可能),否则您将看到所有您的操作发生在单个 CPU 核心上。

在 C 中实现的内置函数发生 "below the GIL" 因为它们更直接地调用底层 API,但是将参数和数据放入这些函数发生在 GIL 中,因为您正在使用字节码读写。

顺便说一句,如果你想更好地理解 cPython 与其宿主的关系,我建议如下 high-level official overview and/or the PDF slides and the playground that I wrote for a conference

None 您提到的函数自动并行化。一般来说,静默生成线程在大多数语言中都被认为是一种糟糕的形式(这种情况正在发生变化,但它仍然只出现在纯函数式语言中,在这些语言中线程安全是通过设计来实现的);在不发出警告的情况下生成大量线程是当用户尝试启动自己的线程并由于线程过多 运行 而出现暂时性错误时出现神秘错误的原因。所以即使 GIL 不是问题,这样做也没有意义。

就是说,GIL 的作用是保护解释器内部,它涵盖了任何引用计数被操纵的场景,这是持续不断的;除了极少数例外,在持有 GIL 的情况下,不可能对 PyObject*s(这是所有 Python 级别类型在 C 中表示的)做任何有意义的工作。通常,Python built-ins 只释放阻塞操作的 GIL(I/O,等待锁等);它仅在 GIL 发布正常的第三方 C 扩展(和 ctypes)中,因为在那些情况下,它们将 PyObject 完全转换为 C 级别类型,现在发布 GIL,因为没有引用计数或正在触及其他内部结构,做昂贵的工作,重新获取 GIL,并将结果从 C 级类型转换回 Python 级对象。