Большая часть функции Numpy по умолчанию включает многопоточность.
например, я работаю на 8-ядерном компьютере Intel Cpu, если я запускаю скрипт
import numpy as np
x=np.random.random(1000000)
for i in range(100000):
np.sqrt(x)
Linux top
покажет 800% загрузки процессора во время работы,
что означает, что numpy автоматически обнаруживает, что моя рабочая станция имеет 8 ядер, и np.sqrt
автоматически использует все 8 ядер для ускорения вычислений.
Однако я обнаружил странную ошибку. Если я запускаю скрипт
import numpy as np
import pandas as pd
df=pd.DataFrame(np.random.random((10,10)))
df+df
x=np.random.random(1000000)
for i in range(100000):
np.sqrt(x)
использование процессора составляет 100%! Это означает, что если вы добавите две панды DataFrame перед запуском любой функции numpy, функция автоматической многопоточности numpy пропадет без предупреждения! Это абсолютно не разумно, почему расчет Pandas dataFrame влияет на настройку потоков Numpy? Это ошибка? Как обойти это?
PS:
Я копаю дальше, используя perf
инструмент Linux .
работает первый скрипт показывает
Во время работы второй скрипт показывает
Таким образом, оба сценария включают в себя libmkl_vml_avx2.so
, в то время как первый сценарий включает дополнительный, libiomp5.so
который, похоже, связан с openMP.
А так как vml означает библиотеку математики для векторов Intel, то, согласно vml doc, я предполагаю, что по крайней мере ниже функции автоматически являются многопоточными.
import numpy as np import pandas as pd import os os.environ["MKL_NUM_THREADS"] = '4' print(os.environ["MKL_NUM_THREADS"]) df=pd.DataFrame(np.random.random((10,10))) df+df print(os.environ["MKL_NUM_THREADS"]) a = np.random.random((20000000, 3)) b = np.random.random((3, 30)) for _ in range(10): c = np.dot(a, b)