python调用matlab慢,python – 为什么numpy在数字化示例上比matlab慢得多?

我比较了numpy与matlab的性能,在几种情况下,我观​​察到numpy显着较慢(索引,数组上的简单操作,如绝对值,乘法和总和等).我们来看看下面的例子,这是一个令人震惊的例子,涉及函数digitalize(我打算用来同步时间戳):

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的相同的例子

scale=[1:1e+6];

y=[1:10:1e+6];

tic

[N,bin]=histc(scale,y);

t=toc;

display(['Time passed is ',num2str(t), ' seconds'])

结果是:

Time passed is 0.10237 seconds

这是560倍快!

当我正在学习用C扩展Python时,我实现了我自己的数字化版本(使用boost库作为扩展):

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.sort),因此与Matlab函数histc相比,我的函数的性能更差(约1.6).

所以问题是:

为什么numpy.digitize这么慢?这个函数不应该被编写和优化的代码编写吗?

>为什么我自己的数字化版本比numpy.digitize快得多,但仍然慢于Matlab(我相信我使用最快的算法可能,因为我假设输入已经排序)?

我正在使用Fedora 16,而且我最近安装了ATLAS和LAPACK库(但性能却有所改变).我应该重建numpy吗我不知道我的安装numpy是否使用适当的库来获得最大的速度,也许Matlab正在使用更好的库.

更新

根据目前的答案,我想强调,如果有人(像我这样的情况)不关心直方图,Matlab函数histc不等同于numpy.histogram.我需要hisc的第二个输出,它是从输入值到提供的输入框的索引的映射.这样的输出由数字化和搜索的numpy函数提供.正如其中一个答案所说,searchsorted比数字化要快得多.然而,searchsorted仍然比Matlab慢一个因子2:

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倍,那么numpy.digitize的意义是什么?

>为什么Matlab函数histc(也提供了numpy.searchsorted的输出)比numpy.searchsorted更快2倍?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值