在MATLAB中使用匿名函数会降低性能...其他人是否注意到了这一点?

为了重构我的MATLAB代码,我认为我会在函数编程的启发下将函数作为参数传递(MATLAB称为匿名函数)。

但是,性能似乎受到了严重打击。在下面的示例中,我比较了不同的方法。 (代码段包装在一个函数中,以便能够使用子函数)

我得到的结果是直接为0秒,使用子函数几乎为0秒,使用匿名函数为5秒。我正在OS X 10.6和C2D 1.8 GHz上运行MATLAB 7.7(R2007b)。

任何人都可以运行代码并查看得到的内容吗?我对Windows的性能特别感兴趣。

function [] = speedtest() clear all; close all; function y = foo(x) y = zeros(1,length(x)); for j=1:N y(j) = x(j)^2; end end x = linspace(-100,100,100000); N = length(x); %% direct t = cputime; y = zeros(1,N); for i=1:N y(i) = x(i)^2; end r1 = cputime - t; %% using subfunction t = cputime; y = foo(x); r2 = cputime - t; %% using anon function fn = @(x) x^2; t = cputime; y = zeros(1,N); for i=1:N y(i) = fn(x(i)); end r3 = cputime-t; [r1 r2 r3] end

回答:

您在使用嵌套函数作弊。 :)匿名函数在循环内被调用,因此您要衡量其调用十万次的成本。嵌套函数仅被调用一次,因此其函数调用开销可忽略不计。为了比较调用匿名函数和命名函数的成本,您应该让嵌套函数执行与匿名函数相同的工作,然后再从循环内部调用它。

我做到了,仍然得到了类似的结果。匿名功能要慢20倍左右。

但是,您仍然可以将函数句柄与非匿名函数一起使用,并且其性能不会与匿名函数相同。这可以与嵌套函数(如原始测试中的foo)一起使用,也可以与非嵌套子函数(不充当闭包,并且可能具有较少的开销)一起使用。

function [] = speedtest() function y = foo(x) y = x^2; end r = struct; ... %% using nested function through function handle fn = @foo; y = zeros(1,N); t = cputime; for i=1:N y(i) = fn(x(i)); end r.nested_handle = cputime - t; ... %% using subfunction through function handle fn = @subfunction_foo; y = zeros(1,N); t = cputime; for i=1:N y(i) = fn(x(i)); end r.subfunction_handle = cputime - t; ... end % end function speedtest function y = subfunction_foo(x) y = x^2; end 我在Windows的R2009b上得到了这个。

>>速度测试 直接:0 嵌套:0.0469 nested_handle:0.0781 子功能:0.0313 subfunction_handle:0.0313 匿名:1.2344另一种看待它的方法是对代码进行结构化,以使其“矢量化”并在数组上运行,从而减少了函数调用的次数,而函数调用的成本无关紧要。 Matlab会更惯用:典型的性能建议是忽略函数调用和循环的开销,因为无论如何您应该对较大的参数进行较少的调用。

更多&回答...

matlab 匿名函数 diff,在MATLAB中使用匿名函数会降低性能...其他人是否注意到了这一点?...相关推荐

  1. python中lambda函数if用法-Python中关于Lambda函数的使用总结

    lambda表达式是一种匿名函数,对应python中的自定义函数def,是定义某个函数时比较高级的一种写法.作为python初学者,本文整理了lambda的一些基本用法和特点. lambda和def的 ...

  2. python自带的sum()函数和numpy库中的sum()函数的区别

    在学习<机器学习实战>一书的第十章时,对 return np.sqrt(sum(np.power(vecA - vecB, 2))) 这样一条语句输出的结果老是不对,明明想要输出的是对两个 ...

  3. java中函数的调用,java中如何调用函数

    java动态调用函数,Java 中使用动态代码,java函数调用,java中如何调用函数 如何在 Java 中调用 C 函数 宗薇 [期刊名称]<网络新媒体技术> [年(卷),期]2000 ...

  4. MATLAB解决线性规划问题,学会使用linprog函数,在一个实例中演示linprog函数各参数的用法

    最近接触到了一个线性规划的题目,尝试用MATLAB解决,动手前想了很多思路,上网搜索了一下发现MATLAB中有专门的linprog函数专门解决线性规划问题,了解学习后果然十分方便.事实上,绝大部分的线 ...

  5. python中匿名函数的作用_Python 中的匿名函数,你会用吗

    原标题:Python 中的匿名函数,你会用吗 概念 我们从一个例子引入. 这里有一个元素为非空字符串的列表,按字符串最后一个字母将列表进行排序.如果原列表是 ['abc', 'g', 'def'],则 ...

  6. JavaScript匿名函数以及在循环中的匿名函数

    一 历史 JavaScript其实是一门奇异的语言,TA的一大特性是没有块级作用域 for(var i=0;i<10;i++){} console.log(i) 大家猜测下值是多少? 答案是 1 ...

  7. 匿名函数自我调用_Python中的匿名函数及递归思想简析

    匿名函数 前言 上次咱们基本说了一下函数的定义及简单使用,Python中的基本函数及其常用用法简析,现在咱们整点进阶一些的.同样都是小白,咱也不知道实际需要不,但是对于函数的执行顺序以及装饰器的理解还 ...

  8. python匿名函数的作用_Python中的匿名函数及递归思想简析

    匿名函数 前言 上次咱们基本说了一下函数的定义及简单使用,Python中的基本函数及其常用用法简析,现在咱们整点进阶一些的.同样都是小白,咱也不知道实际需要不,但是对于函数的执行顺序以及装饰器的理解还 ...

  9. php 匿名函数好处,谈谈PHP中的匿名函数与闭包

    //匿名函数,说白了就是"没有名字的函数",不多说.给一段代码可能更为明白: //例一,定义匿名函数并调用 $str='world'; $func=function ($str) ...

最新文章

  1. vr rgb yuv学习资料整理
  2. php input file ajax,jquery ajax put file, php save file
  3. 汽车电子嵌入式技术篇(一) -CRC-8和CRC-16算法
  4. IntelliJ IDEA 从入门到上瘾教程,2019图文版!
  5. Docker学习总结(66)—— Docker 的三大基石:Namespace、Cgroup 和 rootfs
  6. float相乘后的类型_4、Python语法入门之基本数据类型
  7. lsd 特征点匹配代码_openCV-特征点匹配算法介绍一:理解特征
  8. ADMM算法在神经网络模型剪枝方面的应用
  9. 金九银十面试季,字节跳动面试题拿走不谢(附详细答案解析)
  10. PayPal的一些注意事项
  11. tp6 thinkswoole 使用极光curl请求时报错
  12. 项目经历怎么写_简历里的项目经历怎么写才能打动招生官和面试官?
  13. vue 表情包编码转换
  14. excel函数提取计算机登录名,Excel查找函数FIND,帮你从复杂的地址中提取城市、区和街道名!-提取文件名...
  15. 如何选择正确的图片格式? 图片格式详细科普
  16. 苹果iPhone 12系列发布会:四款新机亮相均支持5G
  17. tensor.view().permute()
  18. AutoHotKey简单入门
  19. 三段式与四段式耳机插头的区别
  20. Excel汉字转换得到其拼音函数

热门文章

  1. 联想think system sr550信息
  2. S Korea unveils $130bn bank aid (2008/10/20)
  3. Temper monkey(油猴)实现问卷星填写
  4. 图形化渗透测试工具 -- GUI_Tools
  5. 2017每天一键领取130淘金币的网址分享
  6. 快速创建流程图、思维导图、组织结构图、拓扑图
  7. 联想服务器什么芯片,联想服务器介绍.ppt
  8. 【Python抽奖系统】好消息:史上最强商场抽奖活动来啦,超优惠,攻略快拿好啦~(超牛)
  9. 免费好用的节假日API——Java实现
  10. Pycharm安装第三方库以及出错原因(Mac版)