Многопроцессорная оптимизация вычислительной производительности Python - PullRequest
0 голосов
/ 15 мая 2018

В настоящее время я работаю над реализацией многопроцессорной обработки в сегменте кода, выполнение которого занимает относительно много времени. Это в основном применение очень сложной функции довольно много раз. На данный момент я использую следующий синтаксис:

if (__name__ == '__main__'):
    pool = Pool(4)
    results = pool.map(function,data) 
    pool.close()
    output = pool.join()

Мой ЦП состоит из 4 ядер, отсюда и Пул (4). Из моего использования ЦП видно, что при реализации многопроцессорной обработки все 4 пула используют примерно 25% доступного ЦП, в отличие от одного ядра ЦП, использующего 25%, когда не используется многопроцессорная обработка. Тем не менее, я вижу, что четыре ядра ЦП используют значительно меньший объем памяти: примерно по 45 КБ каждое в отличие от почти 550 КБ при работе на одном ядре ЦП без многопроцессорной обработки (нехватка памяти, похоже, не является проблемой, так как остается на примерно 27% использования). Вычисление занимает приблизительно 5 минут на одном ядре ЦП, и при работе на всех 4-х часов все еще не завершилось ни одного часа. Может ли кто-нибудь высказать некоторые экспертные мнения о том, что может быть основной причиной этой неэффективности?

Удачного кодирования!

1 Ответ

0 голосов
/ 15 мая 2018

Это, похоже на ваш обновленный код, работает для меня:

import time
from multiprocessing import Pool

def function(x):
    return x * x

if __name__ == '__main__':
    start = time.time()
    pool = Pool(1)
    data = range(50)
    results = pool.map(function, data)

    pool.close()
    output = pool.join()
    print results
    print 'in %.4f seconds' % (time.time() - start)

запустив его из командной строки:

c:\srv\tmp> python mptest.py
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 729, 784, 841, 900, 961, 1024, 1089, 1156, 1225, 1296, 1369, 1444, 1521, 1600, 1681, 1764, 1849, 1936, 2025, 2116, 2209, 2304, 2401]
in 0.2950 seconds

мы можем добавить некоторые записи в function:

def function(x):
    print('inside function(%r)' % x)
    res = x * x
    print('returning from function(%r) => %r' % (x, res))
    return res

и работая с data = range(20) и pool = Pool(2), мы можем видеть два процесса, борющихся за вывод:

c:\srv\tmp> python mptest.py
inside function(0)
inside function(3)returning from function(0) => 0

rinside function(1)eturning from function(3) => 9

rieturning from function(1) => 1nside function(4)

irnside function(2)eturning from function(4) => 16

rieturning from function(2) => 4nside function(5)

irnside function(6)eturning from function(5) => 25

irnside function(9)eturning from function(6) => 36

rieturning from function(9) => 81nside function(7)

irnside function(10)eturning from function(7) => 49

rieturning from function(10) => 100nside function(8)

irnside function(11)eturning from function(8) => 64

rieturning from function(11) => 121nside function(12)

irnside function(15)eturning from function(12) => 144

rieturning from function(15) => 225nside function(13)

irnside function(16)eturning from function(13) => 169

rieturning from function(16) => 256nside function(14)

irnside function(17)eturning from function(14) => 196

rieturning from function(17) => 289nside function(18)

returning from function(18) => 324
inside function(19)
returning from function(19) => 361
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361]
in 0.2700 seconds
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...