为什么列表理解比在熊猫中更快?

时间:2019-08-12 21:09:46

标签: python pandas list-comprehension

使用列表推导比普通的for循环要快得多。这样做的原因是,列表理解中不需要追加,这是可以理解的。 但是我发现在各个地方,列表比较的速度比应用速度要快。我也经历过。但是无法了解使它比应用更快的内部工作原理是什么?

我知道这与numpy中的矢量化有关,后者是pandas数据帧的基本实现。但是导致列表理解比应用更好的原因并不能完全理解,因为在列表理解中,我们在列表内部指定for循环,而在apply中,我们甚至不提供任何for循环(而且我也假设矢量化需要地方)

编辑: 添加代码: 这适用于泰坦尼克号数据集,其中标题是从名称中提取的: https://www.kaggle.com/c/titanic/data

%timeit train['NameTitle'] = train['Name'].apply(lambda x: 'Mrs.' if 'Mrs' in x else \
                                         ('Mr' if 'Mr' in x else ('Miss' if 'Miss' in x else\
                                                ('Master' if 'Master' in x else 'None'))))

%timeit train['NameTitle'] = ['Mrs.' if 'Mrs' in x else 'Mr' if 'Mr' in x else ('Miss' if 'Miss' in x else ('Master' if 'Master' in x else 'None')) for x in train['Name']]

结果: 每个循环782 µs±6.36 µs(平均±标准偏差,共运行7次,每个循环1000个)

每个循环499 µs±5.76 µs(平均±标准偏差,共运行7次,每个循环1000次)

Edit2: 为了为SO添加代码,正在创建一个简单的代码,令人惊讶的是,对于以下代码,结果相反:

import pandas as pd
import timeit
df_test = pd.DataFrame()
tlist = []
tlist2 = []
for i in range (0,5000000):
  tlist.append(i)
  tlist2.append(i+5)
df_test['A'] = tlist
df_test['B'] = tlist2

display(df_test.head(5))


%timeit df_test['C'] = df_test['B'].apply(lambda x: x*2 if x%5==0 else x)
display(df_test.head(5))
%timeit df_test['C'] = [ x*2 if x%5==0 else x for x in df_test['B']]

display(df_test.head(5))

1个循环,每个循环最好3:2.14 s

1个循环,每个循环最好3:2.24秒

Edit3: 正如一些人所建议的那样,那个apply本质上是for循环的,这不是我用for循环运行此代码的情况,它几乎永远不会结束,我不得不在3-4分钟后手动将其停止,并且在此期间它从未完成时间。:

for row in df_test.itertuples():
  x = row.B
  if x%5==0:
    df_test.at[row.Index,'B'] = x*2

运行上述代码大约需要23秒,而套用仅需1.8秒。那么,这些迭代在物理循环和应用之间有什么区别?

0 个答案:

没有答案