最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 如何使用python中的__slots__方法?

    正文概述    2020-05-27   283

    我们在系统学习python时候,在目录上也有看过这个内容,它是可以给python的类添加属性的,想必,在项目使用中尤为重要,另外,我们都知道在书本目录现实的内容,必然是我们要深刻掌握的东西,小伙伴们可不要偷懒,抓紧看看下面内容吧~

    __slots__的简介

    __slots__是可以在定义Python类时添加的属性。

    您可以使用对象实例可以拥有的可能属性来定义插槽。

    使用__slots__的方法如下:

    class WithSlots:
        __slots__ = ('x', 'y')
     
        def __init__(self, x, y):
            self.x, self.y = x, y

    使用__slots__的更高层次的最大原因是:

    1.由于数据结构优化而更快地获取和设置属性;

    2.减少了类实例的内存使用量。 不想使用它的某些原因是,

    3.如果类具有在运行时更改的属性(动态属性),或者存在复杂的对象继承树

    我们做个测试数据:

    首先,我们先进行一些测试,以查看__slots__何时更快,从批量实例化开始。 使用Python的“ timeit”模块和此代码段,我们得到以下结果:

    class WithoutSlots:
        def __init__(self, x, y, z):
            self.x = x
            self.y = y
            self.z = z
     
    class WithSlots:
        __slots__ = ('x', 'y', 'z')
     
        def __init__(self, x, y, z):
            self.x = x
            self.y = y
            self.z = z
     
    def instance_fn(cls):
        def instance():
            x = cls(1, 2, 3)
    return instance
    Without Slots: 0.3909880230203271
    With Slots: 0.31494391383603215
    (averaged over 100000 iterations)

    在这种情况下,使用slots的实例化速度稍快。 这很有意义,因为我们拒绝为给定对象的新实例创建__dict__。 字典通常比元组或列表有更多内存开销。 让我们尝试一个具有更多与实例相关联的属性的类!

    Without Slots: 1.5249411426484585
    With Slots: 1.52750033326447
    (averaged over 100000 iterations)

    通常,使用__slots__并不能真正缩短实例化时间。 尽管不必创建__dict__,但是还有其他开销需要我们稍后再使用的slots来完成,这导致了类似于从实际类中复制字典的运行时间。

    当我们开始快速连续获取和设置值时,真正的加速就起作用了:

    def get_set_fn(cls):
        x = cls(list(range(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 Slots: 11.59717286285013
    With Slots: 9.243316248897463
    (averaged over 100000 iterations)

    速度提高了20%以上! 如果测试范围更广(并且不总是访问相同的属性,且属性的长度比单个字符长),则可以实现更大的加速。

    内存使用情况

    首先,让我们测试元组和字典在内存中的增长方式之间的区别。 当使用__slots__知道给定实例可以存在哪些属性时,它可以为与实例相关联的描述符分配(而不必为每个新对象添加__dict__)。

    Python中,很难描述对象实例使用的确切内存量:sys.getsizeof仅适用于基元和内置函数。 相反,我们将在名为“ Pympler”的库中使用名为asizeof的函数。

    import sys  #没有这一句会报错
    sys.getsizeof(('a', 'b', 'c', 'd'))
    >>> asizeof(('a', 'b', 'c', 'd'))
    304
    >>> asizeof({'a': 'b', 'c': 'd'})
    512
    >>> asizeof(tuple(string.ascii_lowercase))
    1712
    >>> dictionary
    {'e': 'f', 'k': 'l', 'c': 'd', 'g': 'h', 'o': 'p', 'i': 'j', 's': 't', 'm': 'n', 'q': 'r', 'a': 'b', 'y': 'z', 'w': 'x', 'u': 'v'}
    >>> asizeof(dictionary)
    2320

    我们在这里省略了__slots__示例的实现细节:我们没有将一个元组用于描述符,一个元组用于值,而是将它们全部放在一个列表中。 但是,与元组和dict之间的差异相比,我们发现大小的差异并不大:

    >>> asizeof(('a', 'b')) + asizeof(('c', 'd'))
    352
    为了更好的测量,当我们在上一个示例类的slots上实际运行asizeof时,会发生以下情况:
    >>> w1 = WithoutSlots(1, 2, 3)
    >>> asizeof(w1)
    416
    >>> w2 = WithSlots(4, 5, 6)
    >>> asizeof(w2)
    160

    好了,大家也可以动手试试哦~


    起源地下载网 » 如何使用python中的__slots__方法?

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元