Найти - Пользователи
Полная версия: Что вы думаете о таком коде?
Начало » Python для новичков » Что вы думаете о таком коде?
1
alexx11
Проблема заключается в том результат работы параллельных процессов getresult() получаем в виде:
process = 3
("process1result0", "process2result0", "process3result0")
...
("process1result101", "process2result101", "process3result101")
Такие результаты мы получаем для каждой ветки (node), таким образом данные поступают в виде:
for i in range(len(nodes)):
while r = getresult():
nodes[i].append((r,))
Теперь задача :) получить объединённую строку-результат работы каждого процесса, вставив разделитель (“separator”) после каждого node. Не сочтите за извращение, некий геморрой добавляет, оптимальность кода по скорости и наличие двух разделителей между строками (пустой и “separator”).

Моё решение (разбил для читаемости на две строчки и заменил круглые на квадратные, где это возможно):
    znodes = zip(*[[string.joinfields(p, "") for p in zip(*nodes[n])] for n in range(len(nodes))])
result = [string.joinfields(znodes[p], "separator") for p in range(process)]
Это будет работать?
o7412369815963
не совсем понятно что нужно на выходе, но сделал как понял:
r = (
("process1result0", "process2result0", "process3result0"),
("process1result5", "process2result7", "process3result9"),
("process1result15", "process2result17", "process3result19"),
("process1result101", "process2result101", "process3result101")
)

print [reduce(lambda x,y:x+'separator'+y[14:],z)[14:] for z in map(None,*r)]
результат:
['0separator5separator15separator101', '0separator7separator17separator101', '0separator9separator19separator101']
alexx11
Нет, я похоже совсем не понятно изложил мысль.
Вообщем, есть:
process = 3
separator = "*"
nodes = []
nodes.append((("prc1-r0", "prc2-r0", "prc3-r0"), ("prc1-r1", "prc2-r1", "prc3-r1"), ("prc1-r2", "prc2-r2", "prc3-r2")))
nodes.append((("prc1-r10", "prc2-r10", "prc3-r10"), ("prc1-r11", "prc2-r11", "prc3-r11")))
nodes.append((("prc1-r20", "prc2-r20", "prc3-r20"), ("prc1-r21", "prc2-r21", "prc3-r21"), ("prc1-r22", "prc2-r22", "prc3-r22")))
Надо получить:
('prc1-r0prc1-r1prc1-r2*prc1-r10prc1-r11*prc1-r20prc1-r21prc1-r22', 'prc2-r0prc2-r1prc2-r2*prc2-r10prc2-r11*prc2-r20prc2-r21prc2-r22', 'prc3-r0prc3-r1prc3-r2*prc3-r10prc3-r11*prc3-r20prc3-r21prc3-r22')
Поже таки код выше работает.
py.user.next
while r = getresult():
а это работает ?

наверное лучше собрать сначала кортежи, а потом объединять их
alexx11
py.user.next
Код:

while r = getresult():

а это работает ?
=) Блин, это я алгоритмически для представления картины описал.
Ещё раз суть проблемы в том что данные поступают в кортеже, которые используются поэлементно. Т.е. связи между данными в самом кортеже никакой(я таким образом пытаюсь распаралелить работу приложения, т.е. много мест где данные совпадают я возвращаю (x,)*process, а в остальных местах они рассчитываются отдельно). Решения два: либо распаковывать сразу, что громоздко, т.к. (т.е. на самом деле не одна функция getresult а много различных, которые возвращают кортеж), либо сохранять в двумерном массиве: xstorage.append(xtuple), а потом его обработать и получить что надо.
А загвоздка о которой я описал выше возникла из-за того что в одном месте помимо простого объединения данных по процессам, понадобился дополнительный разделитель - так появился трёхмерный массив. И я если честно долго ломал голову что с ним делать, и походу словил правильное решение когда писал на форум(последние две строчки в первом посте). Вроде работает, но оптимально ли?
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