Para C ++, podemos usar o OpenMP para fazer programação paralela; no entanto, o OpenMP não funcionará para Python. O que devo fazer se quiser fazer paralelo com algumas partes do meu programa python?
A estrutura do código pode ser considerada como:
solve1(A)
solve2(B)
Onde solve1
e solve2
são duas funções independentes. Como executar esse tipo de código em paralelo, em vez de em sequência, a fim de reduzir o tempo de execução? Espero que alguém possa me ajudar. Muito obrigado antecipadamente. O código é:
def solve(Q, G, n):
i = 0
tol = 10 ** -4
while i < 1000:
inneropt, partition, x = setinner(Q, G, n)
outeropt = setouter(Q, G, n)
if (outeropt - inneropt) / (1 + abs(outeropt) + abs(inneropt)) < tol:
break
node1 = partition[0]
node2 = partition[1]
G = updateGraph(G, node1, node2)
if i == 999:
print "Maximum iteration reaches"
print inneropt
Onde setinner e setouter são duas funções independentes. É aí que eu quero fazer um paralelo ...
python
parallel-processing
ilovecp3
fonte
fonte
Respostas:
Você pode usar o módulo de multiprocessamento . Nesse caso, eu posso usar um pool de processamento:
Isso gerará processos que podem fazer um trabalho genérico para você. Como não passamos
processes
, ele gerará um processo para cada núcleo de CPU em sua máquina. Cada núcleo da CPU pode executar um processo simultaneamente.Se você deseja mapear uma lista para uma única função, faça o seguinte:
Não use threads porque o GIL bloqueia qualquer operação em objetos python.
fonte
pool.map
também aceita dicionários como args? Ou apenas listas simples?Isso pode ser feito de maneira muito elegante com Ray .
Para paralelizar seu exemplo, você precisa definir suas funções com o
@ray.remote
decorador e depois invocá-las.remote
.Há várias vantagens disso sobre o módulo de multiprocessamento .
Essas chamadas de função podem ser compostas juntas, por exemplo,
Observe que Ray é uma estrutura que eu tenho ajudado a desenvolver.
fonte
pip
. Eu sugiro tentarpip install --upgrade pip
. Se você precisar usásudo
-lo, é possível que a versãopip
que você está usando para instalarray
não seja a mesma que está sendo atualizada. Você pode verificar compip --version
. Além disso, o Windows atualmente não é suportado, portanto, se você estiver no Windows, esse provavelmente é o problema.O CPython usa o Global Interpreter Lock, que torna a programação paralela um pouco mais interessante que o C ++
Este tópico possui vários exemplos e descrições úteis do desafio:
Solução alternativa do GIL (Python Global Interpreter Lock) em sistemas com vários núcleos usando o conjunto de tarefas no Linux?
fonte
A solução, como outros já disseram, é usar vários processos. Qual estrutura é mais apropriada, no entanto, depende de muitos fatores. Além dos já mencionados, há o charm4py e o mpi4py (eu sou o desenvolvedor do charm4py).
Existe uma maneira mais eficiente de implementar o exemplo acima do que usar a abstração do conjunto de trabalhadores. O loop principal envia os mesmos parâmetros (incluindo o gráfico completo
G
) repetidamente para os trabalhadores em cada uma das 1000 iterações. Como pelo menos um trabalhador residirá em um processo diferente, isso envolve copiar e enviar os argumentos para os outros processos. Isso pode ser muito caro, dependendo do tamanho dos objetos. Em vez disso, faz sentido que os funcionários armazenem o estado e simplesmente enviem as informações atualizadas.Por exemplo, no charm4py, isso pode ser feito assim:
Observe que, para este exemplo, realmente precisamos apenas de um trabalhador. O loop principal pode executar uma das funções e fazer com que o trabalhador execute a outra. Mas meu código ajuda a ilustrar algumas coisas:
result_a.get()
está bloqueado aguardando o resultado, o trabalhador A faz o cálculo no mesmo processo.fonte
Em alguns casos, é possível paralelizar loops automaticamente usando o Numba , embora ele funcione apenas com um pequeno subconjunto do Python:
Infelizmente, parece que o Numba funciona apenas com matrizes Numpy, mas não com outros objetos Python. Em teoria, também pode ser possível compilar Python para C ++ e paralelizar automaticamente usando o compilador Intel C ++ , embora eu ainda não tenha tentado isso.
fonte
Você pode usar a
joblib
biblioteca para fazer computação e multiprocessamento paralelos.Você pode simplesmente criar uma função
foo
que deseja executar paralelamente e com base no seguinte trecho de código implementar o processamento paralelo:Onde
num_cores
pode ser obtido damultiprocessing
biblioteca, como segue:Se você possui uma função com mais de um argumento de entrada e deseja apenas repetir um dos argumentos por uma lista, pode usar o comando
partial
função dafunctools
biblioteca da seguinte maneira:Você pode encontrar uma explicação completa do multiprocessamento python e R com alguns exemplos aqui .
fonte