Я думаю, что вопрос лучше адресовать используемым вами библиотекам BLAS / LAPACK, а не SciPy / NumPy.
Некоторые библиотеки BLAS / LAPACK, такие как MKL , используют несколько ядеризначально там, где другие реализации могут и не быть.
В качестве примера взят scipy.linalg.solve
, вот его исходный код (с некоторым кодом обработки ошибок для ясности пропущен):
def solve(a, b, sym_pos=0, lower=0, overwrite_a=0, overwrite_b=0,
debug = 0):
if sym_pos:
posv, = get_lapack_funcs(('posv',),(a1,b1))
c,x,info = posv(a1,b1,
lower = lower,
overwrite_a=overwrite_a,
overwrite_b=overwrite_b)
else:
gesv, = get_lapack_funcs(('gesv',),(a1,b1))
lu,piv,x,info = gesv(a1,b1,
overwrite_a=overwrite_a,
overwrite_b=overwrite_b)
if info==0:
return x
if info>0:
raise LinAlgError, "singular matrix"
raise ValueError,\
'illegal value in %-th argument of internal gesv|posv'%(-info)
Как вы можете видетьэто всего лишь тонкая оболочка вокруг двух семейств функций LAPACK (например, DPOSV
и DGESV
).
На уровне SciPy параллелизма не происходит, но вы наблюдаете функцию с использованием нескольких ядер наваша система.Единственное возможное объяснение состоит в том, что ваша библиотека LAPACK способна использовать несколько ядер, без NumPy / SciPy, которые делают что-либо для этого .