timedelta方法的性能下降
问题描述:
为什么.dt.days
比.dt.total_seconds()
长100倍?timedelta方法的性能下降
df = pd.DataFrame({'a': pd.date_range('2011-01-01 00:00:00', periods=1000000, freq='1H')})
df.a = df.a - pd.to_datetime('2011-01-01 00:00:00')
df.a.dt.days # 12 sec
df.a.dt.total_seconds() # 0.14 sec
答
.dt.total_seconds
基本上是一个乘法,并可以在numpythonic的速度进行:
def total_seconds(self):
"""
Total duration of each element expressed in seconds.
.. versionadded:: 0.17.0
"""
return self._maybe_mask_results(1e-9 * self.asi8)
而如果我们放弃days
操作中,我们看到它的时间花费在在一个缓慢的listcomp与GETATTR和Timedelta对象的构造(source):
360 else:
361 result = np.array([getattr(Timedelta(val), m)
--> 362 for val in values], dtype='int64')
363 return result
364
对我来说这尖叫“看看,让我们得到它正确,当我们到达它时,我们将跨越优化桥梁。“
+0
这些没有许多perf基准 - 欢迎打开问题(公关更好!);这些都很容易优化 – Jeff
更快的选择是'days = pd.Series(df ['a']。dt.values.astype('timedelta64 [D]'))' – unutbu