Python Scipy最小化函数似乎正在自己创建多个线程?

Python Scipy最小化函数似乎正在自己创建多个线程?,python,multithreading,scipy,Python,Multithreading,Scipy,我正在使用scipy最小化函数。它调用的函数是用Cython编译的,并且有一个我写的底层C++实现,但这不重要。由于某种原因,当我运行我的程序时,它会创建尽可能多的线程来填充我所有的CPU。例如,如果我运行top,我会看到800%的cpu被使用,或者在htop上,我会看到8个单独的处理器被使用,而我创建的程序只在一个处理器上运行。我认为scipy甚至没有并行处理功能,我也找不到任何与此相关的文档。可能会发生什么?有什么方法可以控制它吗?如果有一些(支持线程)可用(例如Ubuntu上的默认设置),

我正在使用scipy最小化函数。它调用的函数是用Cython编译的,并且有一个我写的底层C++实现,但这不重要。由于某种原因,当我运行我的程序时,它会创建尽可能多的线程来填充我所有的CPU。例如,如果我运行top,我会看到800%的cpu被使用,或者在htop上,我会看到8个单独的处理器被使用,而我创建的程序只在一个处理器上运行。我认为scipy甚至没有并行处理功能,我也找不到任何与此相关的文档。可能会发生什么?有什么方法可以控制它吗?

如果有一些(支持线程)可用(例如Ubuntu上的默认设置),一些表达式,如
np.dot()
(据我所知,只有密集型)将自动并行运行。另一个可能的例子是稀疏矩阵分解

当然,不同的极小值将表现不同

牛顿型方法(核心:求解稀疏线性方程组)可能基于SuperLU(如果代码不是常见的旧Fortran/C代码之一,其中整个代码是自包含的)。CG类型的方法主要基于矩阵向量积(np.dot;因此密集情况将是并行的)


要想控制这一点,请开始。

这正是发生的事情。我不知道BLAS的一些实现会自动在parellel中运行。将
MKL_NUM_THREADS
设置为1解决了问题。谢谢。@baconeer几年前,ubuntu提供的BLAS是单线程(或者可能是双线程)的。当时情况改变了。正如链接的SO答案所示,分析numpy/scipy中链接的所有内容并不总是那么容易。