Какая разница во времени между нормальным кодом Python и тем же кодом в многопроцессорной обработке? - PullRequest
1 голос
/ 08 июля 2019

Я пытаюсь четко понять разницу функции в одном процессе и одной и той же функции в нескольких ядрах.Следующий нормальный Python-код и многопроцессорный код дают одинаковое время (приблизительно).Я неправильно использую многопроцессорность?

Обычный код Python:

import time

def basic_func(x):
    if x == 0:
        return 'zero'
    elif x % 2 == 0:
        return 'even'
    else:
        return 'odd'


def multiprocessing_func(x):
    y = x * x
    print('{} squared results in a/an {} number'.format(x, basic_func(y)))


if __name__ == '__main__':
    starttime = time.time()
    for each in range(0, 1000):
        multiprocessing_func(each)
    print('That took {} seconds'.format(time.time() - starttime))

Код многопроцессорной обработки:

import time
import multiprocessing


def basic_func(x):
    if x == 0:
        return 'zero'
    elif x % 2 == 0:
        return 'even'
    else:
        return 'odd'


def multiprocessing_func(x):
    y = x * x
    print('{} squared results in a/an {} number'.format(x, basic_func(y)))


if __name__ == '__main__':
    starttime = time.time()
    pool = multiprocessing.Pool()
    pool.map(multiprocessing_func, range(0, 1000))
    pool.close()
    print('That took {} seconds'.format(time.time() - starttime))

Заранее спасибо!Источник кода: Этот учебник

1 Ответ

2 голосов
/ 08 июля 2019

Без многопроцессорности я выполнил этот код за 0.07 с. Многопроцессорная версия заняла 0,28 с. Создание некоторого пула процессов займет несколько раз, и оно может не стоить этого.

Я рекомендую не печатать во время процесса, так как это может создать эффект воронки (ввод-вывод всегда является проблемой для параллельных процессов)

Немного изменив свой код:

import time
import multiprocessing

def basic_func(x):
    if x == 0:
        return 'zero'
    elif x % 2 == 0:
        return 'even'
    else:
        return 'odd'


def multiprocessing_func(x):
    y = x * x
    return basic_func(y)

И сравнение результатов:

starttime = time.time()
for each in range(0, 100000000):
        multiprocessing_func(each)
print('That took {} seconds'.format(time.time() - starttime))

Взял 34с

starttime = time.time()
pool = multiprocessing.Pool(processes=10)
pool.map(multiprocessing_func, range(0, 100000000))
pool.close()
print('That took {} seconds'.format(time.time() - starttime))

Взял 9,6 с

Видите, что "та же самая" проблема имела радикально разные результаты. Ответ на ваш вопрос невозможен, он слишком сильно зависит от исходной проблемы, эффектов последовательности и баланса между продолжительностью задачи и стоимостью создания пула процессов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...