怎样使用python中的__slots__方法?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!
<强> 强> <强> 强>
<强> __slots__的方法如下:强> <强> 强>
class WithSlots: ,,,__slots__ =, (& # 39; x # 39;,, & # 39; y # 39;) , ,,,def __init__(自我,,x,, y): ,,,,,,,,,self.x self.y =, x,, y
<强> __slots__的更高层次的最大原因是:强> <强> 强>
<强> 强> <强> 强>
__slots__何时更快,从批量实例化开始。使用Python的“时间”模块和此代码段,我们得到以下结果:
class WithoutSlots: ,,,def __init__(自我,,x,, y,, z): ,,,,,,,self.x =, x ,,,,,,,self.y =y ,,,,,,,self.z z=, , class WithSlots: ,,,__slots__ =, (& # 39; x # 39;,, & # 39; y # 39;,, & # 39; z # 39;) , ,,,def __init__(自我,,x,, y,, z): ,,,,,,,self.x =, x ,,,,,,,self.y =y ,,,,,,,self.z z=, , def instance_fn (cls): ,,,def 实例(): ,,,,,,,x =, cls (1,, 2,, 3) return 实例 Without 槽:0.3909880230203271 With 槽:0.31494391383603215 (averaged 配套;100000,迭代)
插槽的实例化速度稍快。这很有意义,因为我们拒绝为给定对象的新实例创建__dict__。字典通常比元组或列表有更多内存开销。让我们尝试一个具有更多与实例相关联的属性的类!
Without 槽:1.5249411426484585 With 槽:1.52750033326447 (averaged 配套;100000,迭代)
__slots__并不能真正缩短实例化时间,尽管不必创建__dict__,但是还有其他开销需要我们稍后再使用的槽来完成,这导致了类似于从实际类中复制字典的运行时间。
<强> 强>
def get_set_fn (cls): ,,,x =, cls(列表(范围(26))) ,,,def get_set (): ,,,,,,,x.y =, x.z + 1 ,,,,,,,x.a =x.b 作用;1 ,,,,,,,x.d =x.q +, 3 ,,,,,,,x.i =x.j 作用;1 ,,,,,,,x.z =x.y /, 2 return get_set Without 槽:11.59717286285013 With 槽:9.243316248897463 (averaged 配套;100000,迭代)
20%以上!如果测试范围更广(并且不总是访问相同的属性,且属性的长度比单个字符长),则可以实现更大的加速。
<强> 强> <强> 强>
__slots__知道给定实例可以存在哪些属性时,它可以为与实例相关联的描述符分配(而不必为每个新对象添加__dict__)。
Python中,很难描述对象实例使用的确切内存量:sys。getsizeof仅适用于基元和内置函数。相反,我们将在名为“Pympler”的库中使用名为asizeof的函数。
import sys , #没有这一句会报的错 sys.getsizeof((& # 39;一个# 39;,,& # 39;b # 39;,, & # 39; c # 39;,, & # 39; d # 39;)) 祝辞祝辞祝辞,asizeof((& # 39;一个# 39;,,& # 39;b # 39;,, & # 39; c # 39;,, & # 39; d # 39;)) 304 祝辞祝辞祝辞,asizeof({& # 39;一个# 39;:,& # 39;b # 39;,, & # 39; c # 39;:, & # 39; d # 39;}) 512 在祝辞祝辞,asizeof(元组(string.ascii_lowercase)) 1712 在祝辞祝辞字典 {& # 39;e # 39;:, & # 39; f # 39;,, & # 39; k # 39;:, & # 39; l # 39;,, & # 39; c # 39;:, & # 39; d # 39;,, & # 39;舌鳎# 39;:,& # 39;h # 39;,, & # 39; o # 39;:, & # 39; p # 39;,, & # 39;我# 39;:,& # 39;强生# 39;,,& # 39;& # 39;:,& # 39;t # 39;,, & # 39;猴# 39;:,& # 39;n # 39;,, & # 39;提问# 39;:,& # 39;" # 39;,,& # 39;一个# 39;:,& # 39;b # 39;,, & # 39; y # 39;:, & # 39; z # 39;,, & # 39; w # 39;:, & # 39; x # 39;,, & # 39; u # 39;:, & # 39; v # 39;} 在祝辞祝辞,asizeof(字典) 2320
__slots__示例的实现细节:我们没有将一个元组用于描述符,一个元组用于值,而是将它们全部放在一个列表中。但是,与元组和dict之间的差异相比,我们发现大小的差异并不大:
在祝辞祝辞,asizeof((& # 39;一个# 39;,,& # 39;b # 39;)), +, asizeof ((& # 39; c # 39;,, & # 39; d # 39;)) 352 为了更好的测量,当我们在上一个示例类的插槽上实际运行asizeof时,会发生以下情况: 在祝辞祝辞,w1 =, WithoutSlots (1,, 2,, 3) 在祝辞祝辞,asizeof (w1) 416 祝辞祝辞祝辞,w2 =, WithSlots (4, 5, 6) 在祝辞祝辞,asizeof (w2) 160怎样使用python中的__slots__方法