Найти - Пользователи
Полная версия: Помогите распараллелить вычисления в программе
Начало » Python для новичков » Помогите распараллелить вычисления в программе
1
user32
вот кусок кода где счет происходит
#поиск d
brk = 0
for d in xrange(2, 10):

combi_n_list = combi_n(len(matrix_h), d)
permit_combi_n_list = permit_combi_n(d)

for i in xrange(len(combi_n_list)):
for j in xrange(len(permit_combi_n_list)):
if check_vector(mult_summ (combi_n_list[i], permit_combi_n_list[j])) == 1:
print "<h1>Min code dist. = "+str(d)+"</h1>"
rezult_string = copy.deepcopy(combi_n_list[i])
rezult_coeff = copy.deepcopy(permit_combi_n_list[j])
brk = 1
break
if brk == 1:
break
if brk == 1:
break
как я себе представляю необходимое распараллеливание:

заходим в основной цикл for d in xrange(2, 10):
тут генерим два множества combi_n_list и permit_combi_n_list. в зависимости от параметров множества могут быть довольно блольшие. до несколько тысяч элементов, где элементы массивы

итак, сгенерировали множества. далее нужно распределить вычисления.
создать N потоков. где N - количество элементов в списке combi_n_list (те потоков может быть очень много, 2000-3000, питон позволит сделать столько? и есть ли смысл)

далее в каждый поток закидываем i-й элемент combi_n_list (т.е. по одному элементу на поток, все разные), закидываем в каждый массив permit_combi_n_list.
итак данные в каждый поток заряжены, начинаем в каждом потоке цикл проверки, вот этот:

for j in xrange(len(permit_combi_n_list)):
if check_vector(mult_summ (combi_n_list[i], permit_combi_n_list[j])) == 1:
print "<h1>Min code dist. = "+str(d)+"</h1>"
rezult_string = copy.deepcopy(combi_n_list[i])
rezult_coeff = copy.deepcopy(permit_combi_n_list[j])
brk = 1
break
тут combi_n_list как раз тот элемент который мы закинули в поток.

и так, вот наши потоки считают, считают и если хотя бы в одном потоке выполнилось вот это условие if check_vector(mult_summ (combi_n_list, permit_combi_n_list)) == 1:
то записываем результат из потока который выполнился после условия, вот этот
print “<h1>Min code dist. = ”+str(d)+“</h1>”
rezult_string = copy.deepcopy(combi_n_list)
rezult_coeff = copy.deepcopy(permit_combi_n_list)
и убиваем все потоко и новые не запускаем, вообще убиваем основной цикл, а результаты нужно сохранить в переменных….

плз помогите реализовать…
dimabest
Потоки не ускорят вычисления. Смотреть нужно в сторону процессов.
Я когда-то распараллеливал вычисления - на 4-ядерном процессоре получил ускорение всего в 2.7 раза.
user32
ну либо не потоки а процессы создавать…я не в курсе как это организовать, но сделать надо чтобы прога вычисляла все одновременно а не по очереди….иначе ждать результат несколько часа если не больше
user32
плз кто сможет помочь, могу оплатить работу…
o7412369815963
по простому - можно 10 раз одновременно запустить скрипт с разными параметрами, вот и будет “многопроцессорная” обработка
а вот пример “мултипроцессинга” питоном
user32
сделал так
#поиск d

def prcess (permit_combi_n_list, combi_n_list_i, d):
for j in xrange(len(permit_combi_n_list)):
if check_vector(mult_summ (combi_n_list_i, permit_combi_n_list[j])) == 1:
rezult_message = "<h1>Min code dist. = "+str(d)+"</h1>"
rezult_string = copy.deepcopy(combi_n_list_i)
rezult_coeff = copy.deepcopy(permit_combi_n_list[j])
brk = 1
break




brk = 0
for d in xrange(2, 10):
from multiprocessing import Process

combi_n_list = combi_n(len(matrix_h), d)
permit_combi_n_list = permit_combi_n(d)
mass_prc = range(len(combi_n_list))

for i in xrange(len(combi_n_list)):
mass_prc[i] = Process(target=prcess, args=(permit_combi_n_list,combi_n_list[i], d,))
mass_prc[i].start()

for i in xrange(len(combi_n_list)):
mass_prc[i].join()
if brk == 1:
break
if brk == 1:
break
питон выдал это:

Traceback (most recent call last):
File “C:\Users\vaio\Desktop\codenew.py”, line 690, in <module>
mass_prc.start()
File “C:\Python27\lib\multiprocessing\process.py”, line 104, in start
self._popen = Popen(self)
File “C:\Python27\lib\multiprocessing\forking.py”, line 247, in __init__
to_child.close()
IOError: Invalid argument

как грамотно сделать чтобы заработало?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB