目前我看到5 种方法:
python多进程 最常用的几种方式:
1、multiprocessing
2、concurrent.futures.ProcessPoolExecutor()
3、joblib
使用 joblib 模块对 Pandas加速
如果需要对一个很大的数据集进行操作,而基于一列数据生成新的一列数据可能都需要耗费很长时间。
于是可以使用 joblib 进行并行处理。
假设我们有一个 dataframe 变量 data,要基于它的 source 列生成新的一列 double,其实就是把原来的 source 列做了个平方运算。
pandas中原生apply实现
import pandas as pd
from sqlalchemy import create_engine
mysql_engine=create_engine("""mysql+pymysql://root:xxxx@127.0.0.0.1:3306/tmp""")
df=pd.read_sql("ipesa_apply_a_loan_new",mysql_engine)
def double_func(xcreditScore):
return pow(xcreditScore,2)
df["xcreditScore"] = df["xcreditScore"].apply(double_func)
df[['cust_id','xcreditScore']][1:10]
# 加速
from joblib import Parallel, delayed
import pandas as pd
from sqlalchemy import create_engine
mysql_engine=create_engine("""mysql+pymysql://root:xxxx@127.0.0.0.1:3306/tmp""")
df=pd.read_sql("ipesa_apply_a_loan_new",mysql_engine)
def double_func(xcreditScore):
return pow(xcreditScore,2)
def key_func(subset):
subset["xcreditScore"] = subset["xcreditScore"].apply(double_func)
return subset
data_grouped = df.groupby(df.index)
results = Parallel(n_jobs=8)(delayed(key_func)(group) for index,group in data_grouped)
pd.concat(results)[['cust_id','xcreditScore']][1:10]
4、ppserver
5、pandarallel
pip install pandarallel [--user]
import pandas as pd
import numpy as np
from pandarallel import pandarallel
pandarallel.initialize(nb_workers=4)
# ALLOWED
def func(x):
return x**3
df=pd.DataFrame(np.random.rand(1000,1000))
### 。。。。就是这么easy的调用方式
df.parallel_apply(func, axis=1)