我正在创建一个Python类来表示地理位置。它的主要目标是存储latitude, longitude, elevation
,因此它的使用方式很像C#" struct",这是一种在运行时应该包含大量实例的值类型。
我正在考虑为该类添加一些方法(__str__
将是一个),我想知道向类中添加方法是否会对性能产生任何影响。
我感兴趣的效果指标如下:
例如,我读到__slots__
在某些上下文中很有用,因为默认情况下__dict__
属性会在每个实例上占用一些空间。
所以问题是:
如果我有一个包含大量方法的类,应该存在哪些影响?
或务实地说:
是否应该为一个应该是轻量级的类添加越来越多的方法,我应该尽量避免这种方法?
答案 0 :(得分:2)
你担心什么表现?记忆?属性访问?您需要更清楚地定义参数。
方法只是另一种属性;如果实例没有定义属性,则查找将通过实例落入类对象。查找现有实例属性并不会受到类 * 上可用属性的影响。
因为方法是类的属性,所以内存性能并不受它们的影响;你可以拥有1000或10000个实例,但仍然只有该类中的一个方法。
如果您关心内存性能,则应该使用slots作为对象。插槽不会使属性访问更快,它们仅节省内存占用。
所以,总结一下:
方法不会影响实例的属性查找性能。 instance.latitude
访问权限不会更快或更慢,因为该类有额外的方法。
方法不会影响记忆表现;类对象包含方法,而不是实例。如果您担心内存占用,请使用__slots__
作为属性。
* 从技术上讲,Python在寻找属性时总会在类中查找数据描述符。因为类属性由字典支持,所以平均而言是O(1)常量时间查找。您必须为此创建一个灾难性的哈希冲突链,以便影响性能。有关详细信息,请参阅descriptor howto。