2014-11-10 5 views
0

Я пытаюсь профилировать базовую функцию в Python, чтобы увидеть сравнительное преимущество многопоточности для оценки его результатов. Кажется, что потоковая версия все хуже ухудшается по мере увеличения размера данных, по которым применяется функция. Есть ли накладные расходы в начальных потоках, которые я не учитываю здесь? Может кто-нибудь объяснить, как на самом деле добиться многопоточной оптимизации/что я делаю неправильно?многопоточность работает медленнее, чем один поток?

from multiprocessing import Pool 

def f(x): 
    return x*x 

pool = Pool(processes=4) 

import timeit 
print timeit.timeit('map(f, range(20000000))', setup = "from __main__ import f", number = 1) 
print timeit.timeit('pool.map(f, range(20000000))', setup = "from __main__ import f, pool", number = 1) 

Результаты:

5.90005707741 
11.8840620518 
[Finished in 18.9s] 

Если уместно, я побежал это в Sublime Text 3.

+0

Вы говорите о многопоточности, но вы не используете темы вообще. Я не говорю, что многопроцессорность плохая (обычно это хорошо!), Но ваша терминология запутанна. –

+0

У вас есть процессор, способный обрабатывать? Если нет, тогда возникает своего рода симулированная многопоточность. Не уверен, что вот что вызывает это, но я думаю, что его возможный – user3282276

+0

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

ответ

1

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

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

0

@John уже дал ответ, но я хочу привести пример слишком

from multiprocessing import Pool 

def f(n):#fibonacci 
    if n == 0: 
     return 0 
    elif n == 1: 
     return 1 
    else: 
     return f(n-1) + f(n-2) 

pool = Pool(processes=4) 

import timeit 

print timeit.timeit('map(f, xrange(35))', setup = "from __main__ import f", number = 1) 
print timeit.timeit('pool.map(f, xrange(35))', setup = "from __main__ import f, pool", number = 1) 

Результат:

4.349 
2.497 
Смежные вопросы