为什么pandas.DataFrame.cov()方法对于相同的数据比numpy.dot(...)快几个数量级?

时间:2015-05-21 18:46:08

标签: python algorithm numpy pandas

我在ipython中计算协方差运行时间

>>> from pandas import DataFrame
>>> import numpy as np
>>> # create data frame set
>>> df = get_data()
>>> df.shape
(4795, 1000)
>>> %timeit df.cov()
10 loops, best of 3: 99.5 ms per loop
>>> mat = np.matrix(df.values)
>>> %timeit np.dot(mat.transpose(), mat)
1 loops, best of 3: 1min per loop

1 个答案:

答案 0 :(得分:1)

所以,我已经找出了观察到的速度差异的原因。 。 。但不是为什么这么做的原因。我发现时会更新。

这是答案:"为什么DataFrame.cov方法比转换为numpy矩阵并使用np.cov或np.dot方法快得多?"

DataFrame数据类型为int64。当使用

将其转换为numpy矩阵时
mat = np.matrix(df.to_matrix())

由此产生的垫子' object也是int64类型。

在引擎盖下,DataFrame.cov方法在调用numpy的协方差方法之前将其矩阵转换为float64。

在nint int64的numpy ndarrays或matrices上运行timeit时,你会看到相同的性能滞后。在我的具有shape(16497,5000)数据集的机器上,int64操作无法完成,有时会因内存错误而崩溃。 float64在几秒钟内完成。

所以,简短的回答是上面的numpy.dot方法比DataFrame.cov慢的原因,一个是数据类型不同。

我要调查为什么存在这种差距。