python 有自己的多進包
multiprocessing
去實作并行計算,但在Pandas處理資料中,使用 multiprocessing 并不好使,隻聽見風扇轉啊轉,就不見運作完畢。
為了提高一點資料清洗的速度,找到一個Pandas多程序的方法,
pandarallel
庫,做了一下測試。喜歡本文記得收藏、關注、點贊。
【注】文末提供技術交流方式
小資料集(先試過了1w)可能多程序還沒單程序快,因為程序開啟關閉也要一點時間。于是我弄了 100w 資料來測試:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yNyIDM5gjM0kDM3UjNjRGNyYzX1UjN1ADM3AzLcRDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
利用以上資料做以下處理:
- 剔除 titile,comment 兩列文本中的表情符号
- title,comment 兩列做一個分詞處理,覆寫原來的列
單程序
在互動式環境中輸入如下指令:
'''單程序'''
import jieba
import re
import time
import pandas as pd
def filter_emoji(desstr, restr=''):
if (desstr is None) or str(desstr) == 'nan':
return ''
# 過濾表情
try:
co = re.compile(u'[\U00010000-\U0010ffff]')
except:
co = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]')
return co.sub(restr, desstr)
if __name__ == '__main__':
start = time.time()
data = pd.read_csv('feike.csv',encoding='gbk')
data['comment'] = data['comment'].map(filter_emoji)
data['title'] = data['title'].map(filter_emoji)
data['comment'] = data['comment'].map(lambda s: jieba.lcut(s))
data['title'] = data['title'].map(lambda s: jieba.lcut(s))
end = time.time()
print(end - start)
輸出:
在單程序的情況下,可以看到用時 294s,接近 5min 了。
多程序
multiprocessing
多程序寫法,這種寫法網上一搜一大把,代碼沒有錯,多程序任務可以執行。
例如
run_task
函數中的任務是爬蟲代碼時,沒有什麼問題,但如果是資料清洗的代碼,我測試就很久都跑不出來:
接下來換成Pandas多程序 pandarallel 的寫法就可以:
'''pandarallel 多程序'''
import jieba
import re
import time
import pandas as pd
from pandarallel import pandarallel
pandarallel.initialize(nb_workers=4)
def filter_emoji(desstr, restr=''):
if (desstr is None) or str(desstr) == 'nan':
return ''
# 過濾表情
try:
co = re.compile(u'[\U00010000-\U0010ffff]')
except:
co = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]')
return co.sub(restr, desstr)
if __name__ == '__main__':
start = time.time()
data = data = pd.read_csv('feike.csv',encoding='gbk')
data['comment'] = data['comment'].parallel_apply(filter_emoji)
data['title'] = data['title'].parallel_apply(filter_emoji)
data['comment'] = data['comment'].parallel_apply(lambda s: jieba.lcut(s))
data['title'] = data['title'].parallel_apply(lambda s: jieba.lcut(s))
end = time.time()
print(end - start)
輸出:
可以看到改寫後時間用時 154s(2min30s),比單程序快了一倍。關于 pandarallel 可以檢視文檔:https://github.com/nalepae/pandarallel/tree/v1.5.2
對應的多程序寫法函數對照表,
Pandas
中的 apply,applymap,map 三個函數的差別,寫對應的代碼:
技術交流
歡迎轉載、收藏、有所收獲點贊支援一下!
目前開通了技術交流群,群友已超過2000人,添加時最好的備注方式為:來源+興趣方向,友善找到志同道合的朋友
- 方式①、發送如下圖檔至微信,長按識别,背景回複:加群;
- 方式③、微信搜尋公衆号:Python學習與資料挖掘,背景回複:加群