2014-09-13 7 views
0

У меня есть цикл for, который использует некоторые двоичные условия и, наконец, записывает файл соответствующим образом. Проблема у меня есть, условия верны для многих файлов (иногда требуется около 1000 файлов). Поэтому писать их занимает много времени (около 10 минут). Я знаю, что могу как-то использовать Python multiprocessing и использовать некоторые из ядер.Использовать многопроцессорность для цикла for, Python

Это код, который работает, но использует только одно ядро.

for i,n in enumerate(halo_param.strip()): 
    mask = var1['halo_id'] == n 
    newtbdata = tbdata1[mask] 
    hdu = pyfits.BinTableHDU(newtbdata) 
    hdu.writeto(('/home/Documments/file_{0}.fits').format(i)) 

я наткнулся, что это может быть сделано с помощью Pool из multiprocessing.

if __name__ == '__main__': pool = Pool(processes=4)

Я хотел бы знать, как сделать это и использовать по крайней мере 4 из моих ядер.

ответ

1

Реструктурируйте корпус петли в качестве функции и используйте функцию Pool.map с функцией.

def work(arg): 
    i, n = arg 
    mask = var1['halo_id'] == n 
    newtbdata = tbdata1[mask] 
    hdu = pyfits.BinTableHDU(newtbdata) 
    hdu.writeto(('/home/Documments/file_{0}.fits').format(i)) 

if __name__ == '__main__': 
    pool = Pool(processes=4) 
    pool.map(work, enumerate(halo_param.strip())) 
    pool.close() 
    pool.join() 
+0

так, говоря, 'Я, п = arg', когда мы называем' pool.map' функцию принимает ARG быть 'перечисление (halo_param.strip())'. Но как это происходит? Здесь я не вижу никаких петель, но, похоже, это работает! – ThePredator

+1

@ThePredator, 'multiprocessing.Pool.map' работает как встроенная функция [' map'] (https://docs.python.org/2/library/functions.html#map). 'map' применяет данную функцию для каждого элемента последовательности (или любого итеративного, второго аргумента). Следуйте ссылке, если хотите узнать больше о функции 'map'. – falsetru

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