我比较了numpy与matlab的性能,在一些情况下,我发现numpy明显较慢(索引、数组上的简单操作,如绝对值、乘法、求和等)。让我们看看下面这个例子,它有点惊人,涉及函数数字化(我计划用它来同步时间戳):import numpy as np
import time
scale=np.arange(1,1e+6+1)
y=np.arange(1,1e+6+1,10)
t1=time.time()
ind=np.digitize(scale,y)
t2=time.time()
print 'Time passed is %2.2f seconds' %(t2-t1)
结果是:Time passed is 55.91 seconds
现在让我们使用等价函数histc来尝试同样的例子Matlab
^{pr2}$
结果是:Time passed is 0.10237 seconds
快了560倍!
当我学习用C++扩展Python时,我实现了自己的数字化版本(使用扩展库来增强):import analysis # my C++ module implementing digitize
t1=time.time()
ind2=analysis.digitize(scale,y)
t2=time.time()
print 'Time passed is %2.2f seconds' %(t2-t1)
np.all(ind==ind2) #ok
结果是:Time passed is 0.02 seconds
有一点作弊,因为我的数字化版本假设输入都是单调的,这也许可以解释为什么它比Matlab更快。但是,排序大小为1e+6的数组需要0.16秒(使用numpy.排序)因此,与Matlab函数histc相比,我的函数的性能更差(大约1.6倍)。在
所以问题是:为什么是数字化这么慢?这个函数不应该用编译和优化的代码编写吗?在
为什么我自己的数字化版本比数字化,但仍然比Matlab慢(我很有信心使用最快的算法,假设输入已经排序)?在
我使用的是Fedora16,我最近安装了ATLAS和LAPACK库(但是性能有了很大的变化)。我应该重建纽比吗?我不确定我的numpy安装是否使用适当的库来获得最大的速度,也许Matlab使用的库更好。在
更新
基于到目前为止的答案,我想强调的是,Matlab函数histc不是等价于数字直方图如果有人(像我这样)不关心直方图。我需要hisc的第二个输出,它是从输入值到所提供的输入箱的索引的映射。这种输出由numpy函数数字化和searchsorted提供。正如其中一个答案所说,searchsorted比数字化快得多。但是,searchsorted仍然比Matlab慢了一倍:t1=time.time()
ind3=np.searchsorted(y,scale,"right")
t2=time.time()
print 'Time passed is %2.2f seconds' %(t2-t1)
np.all(ind==ind3) #ok
结果是Time passed is 0.21 seconds
所以现在的问题是:拥有数字化如果存在等价函数numpy.searchsorted哪个速度比280倍?
为什么Matlab函数histc(它也提供的输出)numpy.searchsorted)2倍于numpy.searchsorted?