背景
本文的内容主要来源于 A Beginner’s Guide to Optimizing Pandas Code for Speed 这篇文章,入门级的讲了怎么优化 Pandas DataFrame
的处理速度。
数据准备
-
一个 50000 行的
DataFrame
,其head
如下:d m1 m2 0 GbGXR/7198718882 66 0.670074 1 ylaMAz/121108977765122 74 0.497126 2 TmMGuz/841097771117122 39 0.360868 3 RkzCzz/8210712267122122 76 0.293050 4 sWxCNIji/11587120677873106105 14 0.893429
-
一个函数,接收一个参数:
# 将形如 'GbGXR/7198718882' 这样的字符串 '/' 后面的数字切分出来 def split_id(value): value = str(value) if '/' in value: return value.rsplit('/', 1)[1] return value
开始测试
目的是将 DataFrame
的d
列中的值 ’/
‘ 后面的数字切割出来,生成一个新的 id
列。
1. 最原始的方式,平均7.23s
。
%%timeit
_ids = []
df = origin_df.copy(deep=True)
for i in range(0, len(df)):
_ids.append(split_id(df.iloc[i]['d']))
df['id'] = _ids
1 loop, best of 3: 7.23 s per loop
2. 使用iterrows
,平均3.27s
%%timeit
_ids = []
df = origin_df.copy(deep=True)
for _, row in df.iterrows():
_ids.append(split_id(row['d']))
df['id'] = _ids
1 loop, best of 3: 3.27 s per loop
3. 使用apply
,平均29.5ms
%%timeit
df = origin_df.copy(deep=True)
df['id'] = df['d'].apply(split_id)
10 loops, best of 3: 29.5 ms per loop
4. 使用Pandas series
,平均7.88ms
%%timeit
df = origin_df.copy(deep=True)
df['id'] = split_id(df['d'])
100 loops, best of 3: 7.88 ms per loop
5. 使用NumPy arrays
,平均5.31ms
%%timeit
df = origin_df.copy(deep=True)
df['id'] = split_id(df['d'].values)
100 loops, best of 3: 5.31 ms per loop