使用__slots__和__dict__来节省空间(简直就是质的飞越,LeetCode亲测有效)

本文探讨了Python类的__slots__和__dict__特性。__slots__用于限制实例属性,减少内存消耗,而__dict__存储实例的所有属性,提升访问速度但占用更多空间。通过使用__slots__,在LeetCode问题LCS01.下载插件的解决方案中,实现了空间效率的提升。
摘要由CSDN通过智能技术生成

定义

        __slots__和__dict__都是两个特殊的类属性。

1.__slots__

        __slots__类属性的作用是指定当前类的实例所有包含的所有属性,注意是所有,就是只能是__slots__所指定的属性,不能包含其他以外的属性,也不能新建属性。在运行的时候,它存在的意义就在于告诉解释器:这个类中的所有实例属性都在这儿了!

 

2.__dict__

        __dict__是用来存在实例属性的。就是说,当前实例有什么属性都会存储在这个字典中。__dict__存在提升了属性的访问速度,但是同时也带来了额外的空间消耗,因为__dict__它本质上就是一个字典,而字典是非常消耗空间的。

 

测试

        使用__slots__指定仅仅需要用到的几个属性,如果没有需要用到ed属性,则直接置空,这样在每次创建对象就不会创建额外的属性(包括__dict__属性),从而大大节省了空间。

         这题是:LCS 01. 下载插件

        解题源码:

from collections import deque
class Node:
    __slots__=('l','r','speed','val')
    def __init__(self, l=None, r=None, speed=None, val=None):
        self.l = l
        self.r = r
        self.speed = speed
        self.val = val
class Solution:
    __slots__=()
    def leastMinutes(self, n: int) -> int:
        if n==1:return 1
        root = Node()
        root.l = Node(None, None, 2, 0)  # 左孩子选择宽带加倍
        root.r = Node(None, None, 1, 1)  # 右孩子选择直接下载
        que = deque()
        que.append(root.l)
        que.append(root.r)
        N = 1
        while True:
            node_tmp = []
            flag = 0
            while len(que) > 0:
                cur_node = que.popleft()
                node_tmp.append(cur_node)
                new_l_val = cur_node.val
                if new_l_val >= n:
                    flag = 1
                    N+=1
                    break
                else:
                    new_l_speed = cur_node.speed * 2
                    cur_node.l = Node(None, None, new_l_speed, new_l_val)

                new_r_val = cur_node.val + cur_node.speed
                if new_r_val >= n:
                    flag = 1
                    N+=1
                    break
                else:
                    new_r_speed = cur_node.speed
                    cur_node.r = Node(None, None, new_r_speed, new_r_val)
            if flag:
                break
            else:
                N += 1
            while node_tmp:
                node = node_tmp.pop()
                if node.l: que.append(node.l)
                if node.r: que.append(node.r)
        return N

同步更新于个人博客系统:使用__slots__和__dict__来节省空间(简直就是质的飞越,LeetCode亲测有效)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值