pandas读取、运算数据时,如何让电脑性能最大化
1 背景分析
pandas库是python中最有名的数据分析库,但是有一个很烦人的缺点:不适用于大规模数据。
pandas默认只调用电脑单个的CPU进行数据读取和运算【python程序中的多线程编程实现实际上都是伪实现】。
但是当前的电脑大多是4核,甚至8核,而如果常规使用pandas意味着我们没有充分使用电脑的性能。
2 解决方案
有问题出现,自然就会围绕问题产生很多的创意设计和解决方案,这是世界得以发展的根源所在,扯远了,回正题。
给大家推荐一款专门为加速pandas而开发的包----【modin】, 这个库可以自动按照电脑CPU数调整运行的核数。
2.1 安装方法
pip install modin
2.2 modin使用
导入pandas的时候通过modin.pandas进行导入。
import modin.pandas as pd
2.3 对比使用modin.pandas和pandas的读取数据性能差异
使用modin.pandas读取数据:
import time
import modin.pandas as pd
starttime = time.time()
df = pd.read_csv('data/test.csv')
endtime = time.time()
print('读取100M数据所用的时间:%s' % (endtime-starttime))
读取100M数据所用的时间:0.5474761009212651
使用pandas读取数据:
import time
import pandas as pd
starttime = time.time()
df = pd.read_csv('data/test.csv')
endtime = time.time()
print('读取100M数据所用的时间:%s' % (endtime-starttime))
读取100M数据所用的时间:1.411081828607715
modin只用了0.55s,读取数据的速度加快了2.4倍。
2.4 对比使用modin.pandas和pandas的处理数据性能差异
使用pandas处理数据:
import time
import pandas as pd
df = pd.read_csv('data/test.csv')
starttime = time.time()
newdf = pd.concat([df for _ in range(100)])
endtime = time.time()
print(endtime-starttime)
=================================================
8.425022888182846
使用modin.pandas处理数据:
import time
import modin.pandas as pd
df = pd.read_csv('data/test.csv')
starttime = time.time()
newdf = pd.concat([df for _ in range(100)])
endtime = time.time()
print(endtime-starttime)
=================================================
0.6486723553767629
同样的pandas中的concat()方法操作,使用modin.pandas比pandas快了15倍多
3 拓展知识
modin目前仍然正在不断更新中,并不支持所有的pandas的函数加速。如果加速遇到报错,说明这个操作modin不支持。
默认modin会调用电脑全部的cpu,如果不想全部调用,可以使用ray来限制cpu使用数。
import ray
import warnings
warnings.filterwarnings('ignore')
ray.init(num_cpus=2, ignore_reinit_error=True)
import modin.pandas as pd
如果待操作的数据文件远大于电脑内存RAM,可以设置
import os
os.environ["MODIN_OUT_OF_CORE"]='true'
import modin.pandas as pd