2014-08-09 3 views
1

У меня очень простое приложение с вложенным циклом for, и это может занять от нескольких минут до нескольких часов в зависимости от объема данных.python многопроцессорный пример itertools multple lists

Я начал работу с многопроцессорной библиотеки lib в python. Я попытался реализовать его в самой базовой форме, и даже несмотря на то, что мой код работает, прирост производительности отсутствует. Полагаю, что я неправильно его реализую и/или дизайн моего кода крайне ошибочен.

Мой код довольно прямо вперед:

import csv 
import multiprocessing 

somedata1 = open('data1.csv', 'r') 
SD_data = csv.reader(data1,delimiter=',') 
data1 = [] 
**import lots of CSV data*** 

def crunchnumbers(): 
    for i, vald1 in enumerate(data1): 
     for i, vald2 in enumerate(data2): 
      for i, vald3 in enumerate(data3): 
       for i, vald4 in enumerate(data3): 
        for i, vald5 in enumerate(data3): 
         sol = #add values 
    print d_solution 

if __name__ == '__main__': 
    pool = multiprocessing.Pool(processes=4) 
    pool.apply(crunchnumbers) 

Как я могу сделать это с многопроцессорной питона? (каким-то образом раскалываясь на куски?), или это лучшая работа для кувшина? Основываясь на предложениях по SO, я потратил несколько дней на использование Jug, но количество итераций в моих вложенных for-loops легко попадает в десятки миллионов (и более) очень быстрых транзакций, поэтому автор рекомендует против этого.

+0

Вы не дают достаточно информации: какова зависимость «некоторых критериев»? зависит ли это от одного из «владов»? i? и то и другое ? все ? У меня была эта информация, мы могли бы создать рекурсивную функцию, которая агрегирует промежуточные результаты и рекурсивно вызывается с «отдыхом» – alfasin

+0

@alfasin. Я предоставил условную логику. Я буду исследовать ваше предложение. спасибо – nodoze

ответ

2

Я предлагаю использовать itertools.product с многопроцессорной-карта:

import csv 
import multiprocessing 
from itertools import product 

def crunchnumber(values): 
    if some criteria: 
     sol = values[0][2]+values[1][2]+values[2][2].... 
     return sol 

def process(datas): 
    "takes data1, ..., datan as a list" 
    pool = multiprocessing.Pool(processes=4) 
    result = pool.map_async(crunchnumber, product(*datas)) 
    print [a for a in result if a is not None] 
+0

Я буду копать в itertools.product – nodoze

+0

ах, очень круто, похоже, мне нужно использовать product() вместо моих первых 2 циклов и комбинации() вместо моих последних 3 циклов. – nodoze

+1

Я не уверен, что именно я передаю с продуктом (* datas) и тем, что изначально передается в процесс (datas)? я вызываю с процессом()? Как точно передаются данные csv? Я понимаю гораздо больше того, как многопроцессор работает с картой, и как работает продукт(), но если бы вы могли немного расшириться, я думаю, что я близок к тому, чтобы создать основу, на которой я опишу. – nodoze

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