2015-04-12 2 views
0

Чтение документации: https://docs.python.org/2/library/multiprocessing.html Я решил написать интенсивный код процессора и сравнить многопроцессорность с последовательным вычислением. Прежде всего, если эта библиотека использует многопроцессорность, то почему я вижу только 1 процесс python.exe? Во-вторых, почему последовательные вычисления занимают 12 секунд, а многопроцессорные - 22 секунды?многопроцессор python не использует несколько ядер

серийный код:

from datetime import datetime 

def calc_fib(ind): 
    fb = 1 
    if ind >= 3: 
     prev = 1 
     i = 2 
     while i < ind: 
      prev_tmp = fb 
      fb += prev 
      prev = prev_tmp 
      i += 1 
    return fb 


def long_calc_fib(ind): 
    val = 0 
    for j in range(500): 
     val = calc_fib(ind) 
    return val 

if __name__ == "__main__": 
    t1 = datetime.now() 
    for i in range(10): 
     tmp = long_calc_fib(10000) 
    t2 = datetime.now() 
    print str(t2 - t1) 

многопроцессорная код бассейн:

from datetime import datetime 
from multiprocessing.pool import ThreadPool 

def calc_fib(ind): 
    fb = 1 
    if ind >= 3: 
     prev = 1 
     i = 2 
     while i < ind: 
      prev_tmp = fb 
      fb += prev 
      prev = prev_tmp 
      i += 1 
    return fb 


def long_calc_fib(ind): 
    val = 0 
    for j in range(500): 
     val = calc_fib(ind) 
    return val 


if __name__ == "__main__": 
    t1 = datetime.now() 

    pool = ThreadPool(processes=10) 
    async_results = [] 
    for i in range(10): 
     async_results.append(pool.apply_async(long_calc_fib, (10000,))) 
    for res in async_results: 
     tmp = res.get() 

    t2 = datetime.now() 
    print str(t2 - t1) 

ответ

0

Моя ошибка. Я, должно быть, использовал Pool вместо ThreadPool. Путем перетаскивания ThreadPool в Pool я сократил время до 3 секунд.

+0

Это потому, что поток - это просто подзадача процесса - если вы хотите использовать более одного ядра процессора, вам нужны дополнительные процессы. – ACimander

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