在Python多处理中使用OMP_NUM_THREADS=1

在Python多处理中使用OMP_NUM_THREADS=1,python,multiprocessing,openmp,Python,Multiprocessing,Openmp,我听说在调用使用多处理的Python脚本之前使用OMP\u NUM\u THREADS=1可以加快脚本的速度 这是真的还是假的?如果是,为什么会这样?因为您在评论中说Python程序正在调用一个C模块,该模块使用: OpenMP在进程内执行多线程,默认线程数通常是CPU实际可以同时运行的线程数。(这通常是CPU内核的数量,如果CPU具有Intel的“超线程”功能,则为该数量的倍数。)因此,如果您有一个四核非超线程CPU,则OpenMP将默认运行4个线程 当您使用Python的多处理模块时,您的程

我听说在调用使用多处理的Python脚本之前使用
OMP\u NUM\u THREADS=1
可以加快脚本的速度


这是真的还是假的?如果是,为什么会这样?

因为您在评论中说Python程序正在调用一个C模块,该模块使用:

OpenMP在进程内执行多线程,默认线程数通常是CPU实际可以同时运行的线程数。(这通常是CPU内核的数量,如果CPU具有Intel的“超线程”功能,则为该数量的倍数。)因此,如果您有一个四核非超线程CPU,则OpenMP将默认运行4个线程

当您使用Python的
多处理
模块时,您的程序会启动多个可以同时运行的Python进程。您可以控制进程的数量,但通常希望它是CPU核心/线程的数量,例如,
multiprocessing.CPU\u count()
返回的数量

那么,如果您运行一个运行4个Python进程的
多处理
程序,并且每个进程调用一个OpenMP函数并运行4个线程,那么在四核CPU上会发生什么呢?最终在4个核上运行16个线程。这会起作用,但不会达到最高效率,因为每个核心都需要花费一些时间在任务之间切换

设置
OMP\u NUM\u THREADS=1
基本上会关闭OpenMP多线程,因此每个Python进程都保持单线程


但是,如果这样做,请确保启动了足够多的Python进程!如果您有4个CPU内核,并且只运行2个单线程Python进程,那么您将使用2个内核,而另外2个处于空闲状态。(在这种情况下,您可能需要设置
OMP\u NUM\u THREADS=2

在注释中解析:

OMP_NUM_THREADS是OpenMP的一个选项,OpenMP是一个用于在进程内执行多线程的C/C++/Fortran API。
目前还不清楚这与Python多处理有何关系。
您的Python程序是否调用内部使用OpenMP的C语言编写的模块威扎德


OMP_NUM_THREADS
是一个用于在进程内执行多线程的C/C++/Fortran API的选项。目前还不清楚这与Python多处理有何关系。您的Python程序是否调用内部使用OpenMP的C语言编写的模块?正确。这就解释了一切!因此,我想应该选择避免python多处理来调用另一个正在进行多处理的进程。