Python类相比于等效函数慢多少?

27 投票
4 回答
31298 浏览
提问于 2025-04-17 08:18

当我开始学习Python的时候,我只是用函数过程式代码写了一些应用程序。不过现在我学会了,我发现如果用类来重写代码,代码会更容易读懂(而且我觉得也更容易理解)。

那么,相比于函数,相应的在速度上会慢多少呢?类里的初始化器和方法会对速度产生明显的影响吗?

4 个回答

13

唐纳德·克努斯是计算机领域的一位大咖,他曾说过一句很有名的话:“我们应该忘记小的效率问题,大约97%的时间都可以这样做:过早的优化是万恶之源。”这句话的意思是,如果你只是因为想要提高速度而选择使用过程式编程而不是面向对象编程,这样的决定其实并不明智,因为你可能根本不会看到速度的提升。

如果你的代码能正常运行,而且不需要修改,那就别动它。如果需要修改,那就考虑适当地重构一下,加入一些类,因为在开发过程中,代码的可读性比速度更重要。这样做还会让你在后续维护代码时受益良多。Kernighan和Plauger在《程序设计风格要素》中的一句老话依然适用:

首先,让它能工作。然后(如果运行得不够快)再让它运行得更快。

但最重要的是,优先考虑代码的可读性。真的。

49

回答这个问题:是的,可能会稍微慢一点,其他条件相同的情况下。有些以前是变量的东西(包括函数)现在变成了对象的属性,而 self.foo 的访问速度总是比 foo 慢一点,不管 foo 最初是全局变量还是局部变量。局部变量是通过索引访问的,全局变量是通过名字访问的,但对象的属性查找要么是局部查找,要么是全局查找,还要额外通过名字查找属性,这可能涉及多个地方。调用方法的速度也比调用函数慢一点——不仅获取属性的速度慢,调用的速度也慢,因为方法是一个包装对象,它会调用你写的函数,这样就多了一次函数调用的开销。

这个慢的感觉会明显吗?通常不会。在少数情况下,比如你在某个方法里频繁访问对象属性(成千上万次或更多),可能会感觉到慢。但在这种情况下,你可以在方法的开头把 self.foo 赋值给一个局部变量 foo,然后在整个方法中用这个局部变量来引用,这样就能恢复99.44%的局部变量的性能优势。

除此之外,创建实例时可能会有一些内存分配的开销,这在以前可能没有,但除非你一直在创建和销毁实例,这通常只是一次性的成本。

总的来说:可能会有轻微的性能下降,而在性能下降比较明显的地方,解决起来也很简单。另一方面,如果你的问题适合用面向对象的方式解决,你可能会在编写和维护代码上节省数小时的时间。而节省时间可能就是你选择像Python这样的语言的原因。

32

不。

一般来说,使用类和不使用类在性能上你不会发现有什么区别。虽然不同的代码结构可能会导致一个比另一个快,但具体哪个快是没法确定的。

写代码的时候要考虑别人能看懂,只有在代码运行得不够快的时候,再去优化它。记住:过早优化是万恶之源

撰写回答