新手-ish python/pandas 用戶在這里。我一直在嘗試在 read_fwf 中使用 chunksize arg 并迭代 value_counts 變量。我編寫(xiě)了一個(gè)函數(shù)來(lái)傳遞參數(shù),例如文件迭代器和變量來(lái)解析和計(jì)數(shù)。我希望并行化這個(gè)函數(shù),并能夠同時(shí)將 2 個(gè)文件讀入同一個(gè)函數(shù)。它似乎確實(shí)有效……但是,我的速度出乎意料地變慢了。線程在同一時(shí)間完成,但一個(gè)似乎正在減慢另一個(gè)(IO 瓶頸?)。通過(guò)按順序而不是并行運(yùn)行函數(shù)(324 秒對(duì) 172 秒),我得到了更快的時(shí)間。想法?我在執(zhí)行這個(gè)錯(cuò)誤嗎?我試過(guò)多進(jìn)程但啟動(dòng)映射錯(cuò)誤,我無(wú)法腌制文件迭代器(read_fwf 的輸出)。testdf1=pd.read_fwf(filepath_or_buffer='200k.dat',header=None,colspecs=wlist,names=nlist,dtype=object,na_values=[''],chunksize=1000) testdf2=pd.read_fwf(filepath_or_buffer='200k2.dat',header=None,colspecs=wlist,names=nlist,dtype=object,na_values=[''],chunksize=1000)def tfuncth(df,varn,q,*args): td={} for key in varn.keys(): td[key]=pd.Series() for rdf in df: if args is not None: for arg in args: rdf=eval(f"rdf.query(\"{arg}\")") for key in varn.keys(): ecode=f'rdf.{varn[key]}.value_counts()' td[key]=pd.concat([td[key],eval(ecode)]) td[key]=td[key].groupby(td[key].index).sum() for key in varn.keys(): td[key]=pd.DataFrame(td[key].reset_index()).rename(columns={'index':'Value',0:'Counts'}).assign(Var=key,PCT=lambda x:round(x.Counts/x.Counts.sum()*100,2))[['Var','Value','Counts','PCT']] q.put(td) bands={ '1':'A', '2':'B', '3':'C', '4':'D', '5':'E', '6':'F', '7':'G', '8':'H', '9':'I' } vdict={ 'var1':'e1270.str.slice(0,2)', 'var2':'e1270.str.slice(2,3)', 'band':'e7641.str.slice(0,1).replace(bands)' }更新:經(jīng)過(guò)大量閱讀,這也是我得出的結(jié)論。這是非常簡(jiǎn)單的結(jié)論,我敢肯定,所以如果有人知道,請(qǐng)告訴我。Pandas 不是一個(gè)完全多線程友好的包顯然有一個(gè)名為 'dask' 的包,它復(fù)制了很多 Pandas 函數(shù)。所以我會(huì)調(diào)查一下。在許多情況下,Python 并不是真正的多線程兼容語(yǔ)言因此,諸如“dask”之類的包可以利用多線程。可以分離多個(gè)線程,但只能并行非 CPU 綁定函數(shù)。我的代碼是用 IO 和 CPU 包裝的。簡(jiǎn)單的 IO 可能是并行運(yùn)行的,但會(huì)等待處理器執(zhí)行。我計(jì)劃通過(guò)編寫(xiě)僅 IO 操作并嘗試線程來(lái)測(cè)試這一點(diǎn)。Python 受其編譯器的約束。在純 python 中,它被 GIL 解釋和綁定,一次只執(zhí)行一個(gè)線程Python 可以使用在線程上沒(méi)有全局解釋器鎖 (GIL) 的不同編譯器進(jìn)行編譯。
Python Pandas 線程讀取 read_fwf
千萬(wàn)里不及你
2021-09-14 10:21:32