xra*_*alf 18 python performance class
当我开始学习Python时,我创建了一些没有类(只有函数)的应用程序,现在我知道类,并且知道当我用类重写代码时,代码会更易读(并且易于理解).
当我一般使用类时,代码会慢得多吗?
kin*_*all 35
回答这个问题:是的,它可能会慢一些,其他条件都相同.过去曾经是变量(包括函数)的一些东西现在将成为对象属性,并且self.foo总是稍微慢一些foo,无论foo是最初的全局变量还是本地变量.(本地变量由索引访问,而全局变量按名称访问,但对象的属性查找是本地或全局查找,还有属性的名称附加查找,可能在多个位置.)调用方法也是比调用函数稍慢 - 不仅获取属性的速度较慢,调用的速度也较慢,因为方法是一个调用您编写的函数的包装器对象,增加了额外的函数调用开销.
这会引人注目吗?通常不是.在极少数情况下,可能是,如果您在特定方法中访问对象属性(数千或数百万次).但在这种情况下,您只需分配方法顶部的self.foo局部变量foo,并通过本地名称引用它,以重新获得99.44%的局部变量的性能优势.
除此之外,为您之前可能没有的实例分配内存会有一些开销,但除非您不断创建和销毁实例,否则这可能是一次性成本.
简而言之:性能可能会受到轻微影响,而且性能影响不仅仅是轻微的,也很容易减轻.另一方面,假设您的问题适合面向对象的解决方案,您可以节省编写和维护代码的时间.节省时间可能就是为什么你开始使用像Python这样的语言.
唐纳德·克努特(Donald Knuth)是计算领域的老头脑之一,他认为"我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源." 决定在速度增益的基础上使用程序技术而不是面向对象的技术,这些技术可能无法实现,这不是一个明智的策略.
如果您的代码有效并且不需要修改,那么请随意不管它.如果需要进行修改,那么您应该考虑进行明智的重构以包含类,因为程序可读性比开发期间的速度更重要.您还将看到提高可维护性的好处.来自Kernighan和Plauger的"编程风格元素"的旧锯仍然适用:
首先,让它工作.然后(如果它不能足够快地工作)使其更快地工作.
但是,首先要考虑的是可读性.认真.
你可能并不像你想象的那么在意.
真.
当然,带有类的代码通过间接可能会慢一些.也许.这就是JIT编译的目的,对吧?我永远不会记得哪个版本的python做了这个,哪个不做,因为:
表现无关紧要.
这样的性能差异至少是恒定的.除非你做了大量的计算(你不是!),否则你将花费更多的时间来开发/调试/维护你的代码.优化它.
真.因为你永远无法衡量差异,除非你处于紧张的循环中.而且你不想在python中这样做,除非你真的不关心时间.这不像是你想在python中平衡你的赛格威,对吗?你只想计算一些数字,对吧?你的电脑真的很擅长这个.相信它.
也就是说,这并不意味着课程是要走的路.只是那个速度不是你应该问的问题.相反,尝试找出哪种表示最适合您的代码.看来,现在你知道了类,你会用OO方式编写干净的代码.前进.学习.重复.