是时候安利我们的开源库:Mars。Mars DataFrame 可以用来加速 pandas 执行,即使在单机。而代码几乎无需改动。
以下代码都是在我的笔记本上跑的。
任务一:只读取 CSV 文件
pandas:
In [1]: import pandas as pd
In [2]: %time df = pd.read_csv('ratings.csv')
CPU times: user 4.75 s, sys: 1.13 s, total: 5.88 s
Wall time: 4.71 s
Mars DataFrame:
In [1]: import mars.dataframe as md
In [2]: %time df = md.read_csv('ratings.csv').execute()
CPU times: user 9.55 s, sys: 4.9 s, total: 14.4 s
Wall time: 1.52 s
时间从 4.71s 下降到 1.52s(3.1x)。
任务二:读取 CSV + 分组聚合
pandas:
In [1]: import pandas as pd
In [2]: %%time
...: df = pd.read_csv('ratings.csv')
...: df.groupby('movieId').agg({'rating': ['max', 'min', 'std']})
...:
...:
CPU times: user 6.56 s, sys: 1.15 s, total: 7.72 s
Wall time: 5.42 s
Out[2]:
rating
max min std
movieId
1 5.0 0.5 0.927513
2 5.0 0.5 0.958437
3 5.0 0.5 1.013307
4 5.0 0.5 1.111442
5 5.0 0.5 0.993108
... ... ... ...
176267 4.0 4.0 NaN
176269 3.5 3.5 NaN
176271 5.0 5.0 NaN
176273 1.0 1.0 NaN
176275 3.0 3.0 NaN
[45115 rows x 3 columns]
Mars DataFrame:
In [1]: import mars.dataframe as md
In [2]: %%time
...: df = md.read_csv('ratings.csv')
...: df.groupby('movieId').agg({'rating': ['max', 'min', 'std']}).execute()
...:
...:
CPU times: user 12.5 s, sys: 9.09 s, total: 21.6 s
Wall time: 1.93 s
Out[2]:
rating
max min std
movieId
1 5.0 0.5 0.927513
2 5.0 0.5 0.958437
3 5.0 0.5 1.013307
4 5.0 0.5 1.111442
5 5.0 0.5 0.993108
... ... ... ...
176267 4.0 4.0 NaN
176269 3.5 3.5 NaN
176271 5.0 5.0 NaN
176273 1.0 1.0 NaN
176275 3.0 3.0 NaN
[45115 rows x 3 columns]
时间从 5.42s 下降到 1.93s(2.8x)。
总结
使用 Mars 很简单。只需要:
pip install pymars
而数据数据特别大,还可以使用 Mars 分布式,Mars 很容易部署(通过几个命令),也支持在 k8s 集群拉起服务,yarn 的支持也会很快到来。
想参与 Mars 开发,欢迎提 PR