Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 6, 2018 22:48:50

AndyWarhol
Зарегистрирован: 2018-08-07
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Распараллелить процесс (нет эффекта)

Я пытаюсь разветвить вычисления факториала используя multiprocessing. Я новичок в этом, но начитавшись статей, мне показалось, использование Pool может решить мою проблему. Хотелось бы задавать конечное число worker'ов, которые будут параллелить вычисление. Проблема в том, что когда я думал, что написал все правильно, оказалось, что это совсем не так. По времени практически нет выигрыша относительно однопроцессорного решения. Что не так с моим кодом? Может стоит использовать fork()? Но в этом случае не до конца понимаю, как задавать число worker'ов.

 from multiprocessing import Pool
import time
def factorial(number):
    total = 1
    while number != 1:
        total = total * number
        number = number - 1
    print(total)
if __name__ == '__main__':
    time_start = time.time()
    workers_count = 4
    pool = Pool(processes=workers_count)  # start 4 worker processes
    res = pool.apply_async(factorial, (75000,))  # evaluate
    res.get()
    time_end = time.time()
    print("time with 4 multiprocessing: " + str(time_end - time_start))
    time_start = time.time()
    factorial(75000)
    time_end = time.time()
    print("time as usual: " + str(time_end - time_start))

Отредактировано AndyWarhol (Сен. 6, 2018 23:26:18)

Офлайн

#2 Сен. 7, 2018 00:39:54

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10022
Репутация: +  857  -
Профиль   Отправить e-mail  

Распараллелить процесс (нет эффекта)

Вызов print() из функции убери, результаты нужно класть в неблокирующую очередь. И вообще у тебя функция неправильная. Если подать отрицательное число, она повиснет.

Так что зря ты начала с параллельных программ, там нюансов куча. Делая параллельные программы, нужно понимать, как работает каждая операция под капотом. Также нужно знать, как работает интерпретатор внутри.



Отредактировано py.user.next (Сен. 7, 2018 00:40:42)

Офлайн

#3 Сен. 10, 2018 16:28:33

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2849
Репутация: +  186  -
Профиль   Отправить e-mail  

Распараллелить процесс (нет эффекта)

Вот пример ускорения вычисления множества Мандельброта почти в 2 раза при помощи multiprocessing-а. Ну и не надо забывать что в процессах должны работать реально тяжёлые задачи, иначе в место ускорения можно получить деградацию.

 import time
from multiprocessing import Pool
 
def mandelbrot(cr, ci):
	strok, zi, zr, = "", 0.0, 0.0
	for i in xrange(5000):
		zr2 = zr * zr
		zi2 = zi * zi
		if zi2 + zr2 > 16:
			strok += " "
			break
		zi = zr * zi * 2 + ci
		zr = zr2 - zi2 + cr
	else:
		strok += "*"
	return strok
 
def str_mandelbrot(nk):
	s = []
	for y in xrange(*nk):
		s.append("".join([ mandelbrot(y/40.0-0.5, x/40.0) for x in xrange(-39,39) ]))
	return "\n".join(s)
 
t = time.time()
pool = Pool(processes=2)
s = pool.map(str_mandelbrot, [(-39, -20), (-20, -1), (-1, 18), (18, 39)])
pool.close()
pool.join()
print 'multiprocessing %.02f' % (time.time() - t)
#print "\n".join(s)
 
t = time.time()
s = []
for x in [(-39, -20), (-20, -1), (-1, 18), (18, 39)]:
	s.append(str_mandelbrot(x))
print 'python %.02f' % (time.time() - t)
print "\n".join(s)
 rodegast@rodegast:~$ python ./mandelbrot.py 
multiprocessing 3.02
python 5.82
                                       *                                      
                                       *                                      
                                       *                                      
                                       *                                      
                                       *                                      
                                      ***                                     
                                     *****                                    
                                     *****                                    
                                      ***                                     
                                       * 
                                   *********                                  
                                 *************                                
                                ***************                               
                             *********************                            
                             *********************                            
                              *******************                             
                              *******************                             
                              *******************                             
                              *******************                             
                            ***********************                           
                              *******************                             
                              *******************                             
                             *********************                            
                              *******************                             
                              *******************                             
                               *****************                              
                                ***************                               
                                 *************                                
                                   *********                                  
                                       *                                      
                                ***************                               
                            ***********************                           
                         * ************************* *                        
                         *****************************                        
                      * ******************************* *                     
                       *********************************                      
                      ***********************************                     
                    ***************************************                   
               *** ***************************************** ***              
               *************************************************              
                ***********************************************               
                 *********************************************                
                 *********************************************                
                ***********************************************               
                ***********************************************               
              ***************************************************             
               *************************************************              
               *************************************************              
              ***************************************************             
              ***************************************************             
         *    ***************************************************    *        
       *****  ***************************************************  *****      
       ****** *************************************************** ******      
      ******* *************************************************** *******     
    ***********************************************************************   
    ********* *************************************************** *********   
       ****** *************************************************** ******      
       *****  ***************************************************  *****      
              ***************************************************             
              ***************************************************             
              ***************************************************             
              ***************************************************             
               *************************************************              
               *************************************************              
              ***************************************************             
                ***********************************************               
                ***********************************************               
                  *******************************************                 
                   *****************************************                  
                 *********************************************                
                **** ****************** ****************** ****               
                 ***  ****************   ****************  ***                
                       **************     **************                      
                         ***********       ***********                        
                         **  * ***           *** *  **                        
                          *   *                 *   *



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Сен. 10, 2018 16:30:36)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version