我在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
答案 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慢的原因,一个是数据类型不同。
我要调查为什么存在这种差距。