Python自带multiprocessing包multiprocessing来实现并行计算,但是在Pandas处理数据中,使用multiprocessing并不好用。你只听到风扇转啊转,却看不到运转完成。为了提高数据清洗的速度,找了一个Pandas多进程的方法pandarallel库,做了测试。小数据集(我先试了1w)可能没有单进程多进程快,因为打开和关闭进程需要一点时间。于是我拿到了100w条数据来测试:利用上面的数据做如下处理:去除评论中两列文字中的表情标题,在评论的两列中做一个分词处理,覆盖原来的列表在交互式环境中处理和输入以下命令:'''单进程'''importjiebaimportreimporttimeimportpandasaspddeffilter_emoji(desstr,restr=''):if(desstrisNone)orstr(desstr)=='nan':return''#过滤表达式uDFFF]')returnco.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(lambdas:jieba.lcut(s))data['title']=data['title'].map(lambdas:jieba.lcut(s))end=time.time()print(end-start)输出:在吨单进程的情况下,可以看到耗时294s,接近5分钟。Multi-processmultiprocessing多进程写法,这种写法网上可以找到,代码正确,可以执行多进程任务。比如当run_task函数中的task是爬虫代码时,没有问题,但是如果是数据清洗代码,我测试了很久都运行不了:接下来,可以改成Pandasmulti-processpandarallel:'''pandarallelmulti-process'''importjiebaimportreimporttimeimportpandasasppdfrompandarallelimportpandarallelpandarallel.initialize(nb_workers=4)deffilter_emoji(desstr,restr=''):if(desstrisNone)orstr(desstr)=='nan':return''#过滤表达式try:co=re.compile(u'[\U00010000-\U0010ffff]')except:co=re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]')返回co.sub(restr,desstr)如果__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(lambdas:jieba.lcut(s))data['title']=data['title'].parallel_apply(lambdas:jieba.lcut(s))end=time.time()print(end-start)output:OK看到重写时间,需要154s(2min30s),比单进程快一倍,对应多进程写函数对照表,pandas中apply、applymap、map这三个函数的区别,写对应的代码:以上就是全部内容本次分享,想了解更多Python知识,欢迎来到公众号:Python编程学习圈,日常干货分享,发送“J”还能领取大量学习资料。
