天天看點

Pandas 多程序處理資料,速度的确快了很多

python 有自己的多進包 ​

​multiprocessing​

​ 去實作并行計算,但在Pandas處理資料中,使用 multiprocessing 并不好使,隻聽見風扇轉啊轉,就不見運作完畢。

為了提高一點資料清洗的速度,找到一個Pandas多程序的方法,​

​pandarallel​

​ 庫,做了一下測試。喜歡本文記得收藏、關注、點贊。

【注】文末提供技術交流方式

小資料集(先試過了1w)可能多程序還沒單程序快,因為程序開啟關閉也要一點時間。于是我弄了 100w 資料來測試:

Pandas 多程式處理資料,速度的确快了很多

利用以上資料做以下處理:

  • 剔除 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)      

輸出:

Pandas 多程式處理資料,速度的确快了很多

在單程序的情況下,可以看到用時 294s,接近 5min 了。

多程序

​multiprocessing​

​多程序寫法,這種寫法網上一搜一大把,代碼沒有錯,多程序任務可以執行。

例如 ​

​run_task​

​ 函數中的任務是爬蟲代碼時,沒有什麼問題,但如果是資料清洗的代碼,我測試就很久都跑不出來:

Pandas 多程式處理資料,速度的确快了很多

接下來換成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)      

輸出:

Pandas 多程式處理資料,速度的确快了很多

可以看到改寫後時間用時 154s(2min30s),比單程序快了一倍。關于 pandarallel 可以檢視文檔:https://github.com/nalepae/pandarallel/tree/v1.5.2

對應的多程序寫法函數對照表,​

​Pandas​

​中的 apply,applymap,map 三個函數的差別,寫對應的代碼:

Pandas 多程式處理資料,速度的确快了很多

技術交流

歡迎轉載、收藏、有所收獲點贊支援一下!

Pandas 多程式處理資料,速度的确快了很多

目前開通了技術交流群,群友已超過2000人,添加時最好的備注方式為:來源+興趣方向,友善找到志同道合的朋友

  • 方式①、發送如下圖檔至微信,長按識别,背景回複:加群;
  • 方式③、微信搜尋公衆号:Python學習與資料挖掘,背景回複:加群