怎样使用python中的__slots__方法

  介绍

怎样使用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__方法