为什么Pandas .isin()方法比“==”更快

问题描述 投票:1回答:1

我想知道为什么

df['new_col'] = (df['old_col'] == 'string').astype(int)
815 µs ± 6.63 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

比...慢

df['new_col'] = df['old_col'].isin(['string']).astype(int)
334 µs ± 5.33 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
python pandas dataframe
1个回答
2
投票

您的测试不具代表性。使用更大的数据帧:

import pandas as pd, numpy as np

df = pd.DataFrame(np.random.randint(0, 9, 100000))

%timeit df[0].isin([1])  # 12.8ms
%timeit df[0] == 1       # 285µs

对于较小的数据帧,例如nrows=10,我看到isin timeit的警告:“最慢的运行时间比最快的时间长4.21倍。这可能意味着中间结果被缓存。”

我不会担心微秒。如果您发现较大的数据帧存在显着的性能差异,则可能值得研究。

正如一位智者曾经说过的那样,过早的优化是万恶之源。

更新

pandas算法似乎存在一些问题,这在numpy数组等效的列表推导中并不明显:

df = pd.DataFrame({'old_col':['string', 'new']})

df = pd.concat([df] * 10000, ignore_index=True) 
arr = df.values

%timeit [i in ['string'] for i in arr]  # 106ms
%timeit [i == 'string' for i in arr]    # 106ms
%timeit df['old_col'].isin(['string'])  # 1.25ms
%timeit df['old_col'] == 'string'       # 2.88ms

isin版本使用numpy.in1d,这是相当有效的。

© www.soinside.com 2019 - 2024. All rights reserved.