簡體   English   中英

多進程Python / Numpy代碼可更快地處理數據

[英]Multiprocess Python/Numpy code for processing data faster

我正在讀取數百個HDF文件,並分別處理每個HDF的數據。 但是,由於它一次只處理一個HDF文件,因此需要花費大量時間。 我只是偶然發現http://docs.python.org/library/multiprocessing.html ,現在想知道如何使用多處理來加快處理速度。

到目前為止,我想到了這個:

import numpy as np
from multiprocessing import Pool

def myhdf(date):
    ii      = dates.index(date)
    year    = date[0:4]
    month   = date[4:6]
    day     = date[6:8]
    rootdir = 'data/mydata/'
    filename = 'no2track'+year+month+day
    records = read_my_hdf(rootdir,filename)
    if records.size:
        results[ii] = np.mean(records)

dates = ['20080105','20080106','20080107','20080108','20080109']
results = np.zeros(len(dates))

pool = Pool(len(dates))
pool.map(myhdf,dates)

但是,這顯然是不正確的。 您能遵循我的想法去做嗎? 我需要更改什么?

嘗試joblib獲得更友好的multiprocessing包裝器:

from joblib import Parallel, delayed

def myhdf(date):
    # do work
    return np.mean(records)

results = Parallel(n_jobs=-1)(delayed(myhdf)(d) for d in dates)

Pool classes 映射函數類似於標准的python庫map函數,可以確保按放入順序返回結果。知道這一點,唯一的另一招是需要以一致的方式返回結果,然后對其進行過濾。

import numpy as np
from multiprocessing import Pool

def myhdf(date):
    year    = date[0:4]
    month   = date[4:6]
    day     = date[6:8]
    rootdir = 'data/mydata/'
    filename = 'no2track'+year+month+day
    records = read_my_hdf(rootdir,filename)
    if records.size:
        return np.mean(records)

dates = ['20080105','20080106','20080107','20080108','20080109']

pool = Pool(len(dates))
results = pool.map(myhdf,dates)
results = [ result for result in results if result ]
results = np.array(results)

如果您確實希望盡快獲得結果,則可以使用imap_unordered

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM