2013-06-23 4 views
5

Возможно ли ускорить выполнение одной задачи с использованием многопроцессорной обработки/потоковой обработки? Я чувствую, что ответ «нет». Вот пример того, что я имею в виду под «одной задачи»:Ускорение выполнения одной задачи с использованием многопроцессорной или потоковой обработки

for i in range(max): 
    pick = random.choice(['on', 'off', 'both']) 

С аргументом 10000000 он занимает около 7,9 секунд, чтобы завершить в моей системе.

У меня есть основное понимание того, как использовать многопроцессорную обработку и многопоточность для нескольких задач. Например, если у меня есть 10 каталогов, каждый из которых содержит X количество файлов, которые нужно читать, я мог бы использовать создание 10 потоков.

Я подозреваю, что в одной задаче используется только один процесс (диспетчер задач сообщает, что использование ЦП минимально). Есть ли способ использовать мои другие ядра в таких случаях? Или увеличивает скорость CPU/Memory - единственный способ получить более быстрый результат?

+6

Многопроцессорная обработка может помочь, несколько потоков в одном процессе не так много (ключевое слово: «блокировка глобального интерпретатора» aka «GIL») –

+0

@ Майкл Бутшер: Не могли бы вы привести пример того, как я мог бы разбить код, упомянутый мною, с использованием многопроцессорности ? –

+3

Вы можете прочитать http://mikecvet.wordpress.com/2010/07/02/parallel-mapreduce-in-python/ для примера –

ответ

5

Вот эталоном кода с и без многопроцессорной:

#!/usr/bin/env python 

import random 
import time 

def test1(): 
    print "for loop with no multiproc: " 
    m = 10000000 
    t = time.time() 
    for i in range(m): 
     pick = random.choice(['on', 'off', 'both']) 
    print time.time()-t 

def test2(): 
    print "map with no multiproc: " 
    m = 10000000 
    t = time.time() 
    map(lambda x: random.choice(['on', 'off', 'both']), range(m)) 
    print time.time()-t 

def rdc(x): 
    return random.choice(['on', 'off', 'both']) 

def test3(): 
    from multiprocessing import Pool 

    pool = Pool(processes=4) 
    m = 10000000 

    print "map with multiproc: " 
    t = time.time() 

    r = pool.map(rdc, range(m)) 
    print time.time()-t 

if __name__ == "__main__": 
    test1() 
    test2() 
    test3() 

И вот результат на моей рабочей станции (который является QuadCore):

for loop with no multiproc: 
8.31032013893 
map with no multiproc: 
9.48167610168 
map with multiproc: 
4.94983720779 

Можно для ускорения одной задачи с использованием многопроцессорной обработки/потоковой обработки? Я чувствую, что ответ «нет».

хорошо, afaict, ответ «черт, да».

Есть ли способ использовать другие сердечники в таких случаях? Или увеличивает скорость CPU/Memory - единственный способ получить более быстрый результат?

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

+1

Ответ: «Черт, да», только если вы используете хороший компьютер. На моем нетбуке test3 работает медленнее, чем test1. – michaelmeyer

+1

Ответ «damn yes» зависит от количества ядер вашего компьютера. Если вы создаете пул процессов, у которых есть такое же количество процессов, которые у вас есть, вы получите от него (учитывая, что у вас есть несколько ядер). Если вы этого не сделаете, это будет одинаково (планировщик не делает чудеса). – zmo

+1

@zmo: 3:16 мог бы кричать «Черт, да!», Но «черт, да» тоже работает :) Спасибо. –

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

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