A maioria das funções do Numpy habilitará multithreading por padrão.
por exemplo, eu trabalho em uma estação de trabalho intel cpu de 8 núcleos, se eu executar um script
import numpy as np
x=np.random.random(1000000)
for i in range(100000):
np.sqrt(x)
o linux topmostrará 800% de uso da CPU durante a execução, como o
que significa que o numpy detecta automaticamente que minha estação de trabalho possui 8 núcleos e np.sqrtusa automaticamente todos os 8 núcleos para acelerar a computação.
No entanto, eu encontrei um bug estranho. Se eu executar um script
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)
o uso da CPU é 100% !!.
Isso significa que, se você adicionar dois DataFrame de dois pandas antes de executar qualquer função numpy, o recurso de multithreading automático de numpy desaparecerá sem nenhum aviso! Isso não é absolutamente razoável, por que o cálculo do DataFrame do Pandas afetaria a configuração de segmentação do Numpy? Isso é um bug? Como contornar isso?
PS:
Eu cavo ainda mais usando a perfferramenta Linux .
executando o primeiro script mostra
Ao executar o segundo script, mostra
Portanto, ambos os scripts envolvem libmkl_vml_avx2.so, enquanto o primeiro script envolve outros libiomp5.soque parecem estar relacionados ao openMP.
E como vml significa intel math math library, de acordo com o vml doc, acho que pelo menos as funções abaixo são automaticamente multithread
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)


