Документация по Python

Параллельные вычисления

В: Документация по Python

Введение

Примеры

Использование многопроцессорного модуля для распараллеливания задач

 import multiprocessing

def fib(n):
    """computing the Fibonacci in an inefficient way
    was chosen to slow down the CPU."""
    if n <= 2:
        return 1
    else:
        return fib(n-1)+fib(n-2) 
p = multiprocessing.Pool() 
print(p.map(fib,[38,37,36,35,34,33]))

# Out: [39088169, 24157817, 14930352, 9227465, 5702887, 3524578]

 

Поскольку выполнение каждого вызова fib происходит параллельно, время выполнения полного примера 1,8 × быстрее , чем если бы сделано последовательным образом на двойной процессор.

Python 2.2+

Использование сценариев Parent и Children для параллельного выполнения кода

child.py

 import time

def main():
    print "starting work"
    time.sleep(1)
    print "work work work work work"
    time.sleep(1)
    print "done working"

if __name__ == '__main__':
    main()

 

parent.py

 import os

def main():
    for i in range(5):
        os.system("python child.py &")

if __name__ == '__main__':
    main()

 

Это полезно для параллельных, независимых задач HTTP-запроса / ответа или выбора / вставки базы данных. Аргументы командной строки может быть дан child.py сценария , а также. Синхронизация между сценариями может быть достигнута всеми сценариями, регулярно проверяющими отдельный сервер (например, экземпляр Redis).

Использование C-расширения для распараллеливания задач

Идея здесь состоит в том, чтобы переместить вычислительные задания на C (с помощью специальных макросов), независимо от Python, и заставить код C освобождать GIL во время его работы.

 #include "Python.h"
...
PyObject *pyfunc(PyObject *self, PyObject *args) {
    ...
    Py_BEGIN_ALLOW_THREADS
    // Threaded C code
    ...
    Py_END_ALLOW_THREADS
    ...
} 

Использование модуля PyPar для распараллеливания

PyPar - это библиотека, которая использует интерфейс передачи сообщений (MPI) для обеспечения параллелизма в Python. Простой пример в PyPar (как видно на https://github.com/daleroberts/pypar ) выглядит следующим образом :

import pypar as pp

ncpus = pp.size()
rank = pp.rank()
node = pp.get_processor_name()

print 'I am rank %d of %d on node %s' % (rank, ncpus, node)

if rank == 0:
  msh = 'P0'
  pp.send(msg, destination=1)
  msg = pp.receive(source=rank-1)
  print 'Processor 0 received message "%s" from rank %d' % (msg, rank-1)
else:
  source = rank-1
  destination = (rank+1) % ncpus
  msg = pp.receive(source)
  msg = msg + 'P' + str(rank)
  pypar.send(msg, destination)
pp.finalize()

Синтаксис

Параметры

Примечания

Еще от кодкамп
Замечательно! Вы успешно подписались.
Добро пожаловать обратно! Вы успешно вошли
Вы успешно подписались на кодкамп.
Срок действия вашей ссылки истек.
Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.
Успех! Ваша платежная информация обновлена.
Ваша платежная информация не была обновлена.