python类中的方法数量会影响性能吗?

时间:2014-06-08 15:33:13

标签: python performance class methods

我正在创建一个Python类来表示地理位置。它的主要目标是存储latitude, longitude, elevation,因此它的使用方式很像C#" struct",这是一种在运行时应该包含大量实例的值类型。

我正在考虑为该类添加一些方法(__str__将是一个),我想知道向类中添加方法是否会对性能产生任何影响。

我感兴趣的效果指标如下:

  • 对象创建开销;
  • 内存开销(创建大量实例时)
  • 即使在"额外的方法"不叫。

例如,我读到__slots__在某些上下文中很有用,因为默认情况下__dict__属性会在每个实例上占用一些空间。

所以问题是:

  

如果我有一个包含大量方法的类,应该存在哪些影响?

或务实地说:

  

是否应该为一个应该是轻量级的类添加越来越多的方法,我应该尽量避免这种方法?

1 个答案:

答案 0 :(得分:2)

你担心什么表现?记忆?属性访问?您需要更清楚地定义参数。

方法只是另一种属性;如果实例没有定义属性,则查找将通过实例落入类对象。查找现有实例属性并不会受到类 * 上可用属性的影响。

因为方法是类的属性,所以内存性能并不受它们的影响;你可以拥有1000或10000个实例,但仍然只有该类中的一个方法。

如果您关心内存性能,则应该使用slots作为对象。插槽不会使属性访问更快,它们节省内存占用。

所以,总结一下:

  • 方法不会影响实例的属性查找性能。 instance.latitude访问权限不会更快或更慢,因为该类有额外的方法。

  • 方法不会影响记忆表现;类对象包含方法,而不是实例。如果您担心内存占用,请使用__slots__作为属性。


* 从技术上讲,Python在寻找属性时总会在类中查找数据描述符。因为类属性由字典支持,所以平均而言是O(1)常量时间查找。您必须为此创建一个灾难性的哈希冲突链,以便影响性能。有关详细信息,请参阅descriptor howto