【问题标题】:Pandas .min() method doesn't seem fastestPandas .min() 方法似乎不是最快的
【发布时间】:2018-12-10 16:38:34
【问题描述】:

我正在尝试获取我的 Pandas df 列的mins、maxs、means 等(所有某种数值),但 Pandas 方法似乎不是最快的。似乎如果我先用.values 打它,这些操作的运行时间就会大大提高。这是期望的行为吗(意思是 Pandas 做了一些愚蠢或有意的事情?也许我用.values 击中它会耗尽额外的内存,或者我正在做出假设和/或以某种方式让它变得更容易,这不是给定的.. .).

意外行为的“证据”:

df = pd.DataFrame(np.random.randint(0,1000,size=(100000000, 4)), columns=list('ABCD'))

start = time.time()
print(df['A'].min())
print(time.time()-start)`

# 0
# 1.35876178741


start = time.time()
df['A'].values.min()
print(time.time()-start)

# 0
# 0.225932121277

start = time.time()
print(np.mean(df['A']))
print(time.time()-start)

# 499.49969672
# 1.58990907669

start = time.time()
print(df['A'].values.mean())
print(time.time()-start)

# 499.49969672
# 0.244406938553

【问题讨论】:

  • 您不应使用time.time() 进行分析。为此目的有一个模块timeit
  • 明白了。以后会用timeit,谢谢!

标签: python pandas performance dataframe


【解决方案1】:

当您只调用一个列时,您正在将其缩减为一个 pandas 系列,它基于一个 numpy 数组,但包含更多内容。 Pandas 对象针对电子表格或数据库类型的操作(如连接、查找等)进行了优化。

当您在列上调用 .values 时,它会使其成为一个 numpy 数组,这是针对 C 中的数学和向量运算优化的 dtype。即使对 ndarray 类型进行了“展开”,数学运算效率也毫不逊色于系列数据类型。 Here is a quick discussion on some of the differences.

附带说明,有一个特定的模块 - timeit 用于这些类型的时间比较

type(df['a'])

pandas.core.series.Series

%timeit df['a'].min()

6.68 ms ± 121 µs per loop

type(df['a'].values)

numpy.ndarray

%timeit df['a'].values.min()

696 µs ± 18 µs per loop

【讨论】:

  • 酷。 Pandas .min() 不默认自动执行此操作是否有原因?这有一些(非时间)成本吗?
  • 我能想到的几个原因,最重要的是 python 通常不会更改对象的类型,除非用户明确要求它,以防止类型混淆.这就是为什么它们包含 .values 属性以防您想使用它的原因,但您可能会在 .min() 之上构建其他系列操作,这些操作不适用于 ndarrays
  • 这并不能解释 df['A'].mean()df['A'].values.mean() 之间的区别(第一个在我的机器上更快)。
  • 在我的机器上,1.16 ms ± 43.2 µs per loop 对应于column.mean()901 µs ± 20.3 µs per loop 对应于column.values.mean()。差别不大,但很明显。 (数据帧建立在 1,000,000 行随机整数上)。如果我在相同长度的浮点数系列上执行.mean 操作,使用.values()8.73 ms1.2 ms)的运行时间将提高约 8 倍
  • Pandas 方法有很多开销。其中一些是处理 NaN 数据、索引对齐等。
猜你喜欢
  • 2018-04-01
  • 2017-12-11
  • 2017-12-31
  • 2014-02-03
  • 2019-05-16
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多