python优化之-slot

本文探讨了在Python中,当实例数量庞大时如何通过使用__slots__来节省内存。对比了普通类与使用__slots__定义的类在实例化后的属性差异,特别是__dict__所占用的内存。__slots__限制了实例的动态绑定,防止额外内存开销,适合大量实例的情况。但同时,使用__slots__的类无法添加新属性。
摘要由CSDN通过智能技术生成

当实例特别多的时候,达到百万级别时,使用slot可节省内存

  • 定义一个普通的类
class People():
	def __init__(self, name, sex, height, weight):
		self.name = name
		self.sex = sex
		self.height = height
		self.weight = weight
  • 使用slot的类
class PeopleSlot():
	__slots__ = ["name", "sex", "height", "weight"]
	def __init__(self, name, sex, height, weight):
		self.name = name
		self.sex = sex
		self.height = height
		self.weight = weight
  • 创建两个类的实例:

one = People(“Tim”, “male”, “180”, “78”)
two = PeopleSlot(“Alice”, “female”, “158”, “45”)

查看两个实例的属性:
在这里插入图片描述

在这里插入图片描述

  • 做差集,发现使用slot后的缺少了__dict__和__weakref__属性
    在这里插入图片描述

    • __weakref__只是一个不透明的对象,在不使用弱引用时,不占什么内存
      • 对于每个实例,如果没有变量,则定义的类__slots__不支持对其实例的弱引用。如果需要弱引用支持,则__weakref__在__slots__声明中添加到字符串序列。

使用,主要占内存的是__dict__

  • __dict__实现了实例的动态绑定,占用的一定的内存
  • 实例越多,one.__dict__占用的内存越大。
  • 下图操作步骤:
    • 查看one.__dict__中的内容
    • 查看one.__dict__占用的内存
    • one添加属性
    • 再次查看one.__dict__占用内存

在这里插入图片描述

  • 给使用了slot的实例,就不能添加属性

在这里插入图片描述

总结,实例很多时,可以使用__slots__ = []来定义

好的,我可以为您提供一个简单的排班优化算法的 Python 实现。这个算法会基于员工的工作时长限制和工作需求,来生成一份最小化人力成本的排班表。 以下是一个基本的排班优化算法的 Python 实现: ```python import random # 员工列表,每个员工都有一个工作时长限制和一些不能工作的时间段 employees = [ {'name': 'John', 'hours': 8, 'unavailable': [(7, 9), (14, 15)]}, {'name': 'Jane', 'hours': 8, 'unavailable': [(9, 12)]}, {'name': 'Bob', 'hours': 8, 'unavailable': [(12, 15)]}, {'name': 'Alice', 'hours': 8, 'unavailable': []} ] # 工作日列表,每个工作日都有 8 个小时的工作时长 workdays = [8] * 5 # 计算每个员工可以工作的时间段 def available_times(employee): available = [] for i in range(len(workdays)): for j in range(workdays[i]): time_slot = (i, j) if time_slot not in employee['unavailable']: available.append(time_slot) return available # 计算当前排班表的总成本 def calculate_cost(schedule): cost = 0 for i in range(len(workdays)): for j in range(workdays[i]): employees_working = [] for employee in schedule: if (i, j) in employee['schedule']: employees_working.append(employee) if len(employees_working) == 0: cost += 100 elif len(employees_working) > 1: cost += len(employees_working) * 10 return cost # 生成一个随机的排班表 def generate_random_schedule(): schedule = [] for employee in employees: schedule.append({'name': employee['name'], 'schedule': []}) for i in range(len(workdays)): for j in range(workdays[i]): available_employees = [] for employee in schedule: if (i, j) in available_times(employee): available_employees.append(employee) if len(available_employees) > 0: employee = random.choice(available_employees) employee['schedule'].append((i, j)) return schedule # 优化排班表,直到达到最小成本 def optimize_schedule(schedule): while True: new_schedule = schedule.copy() for i in range(len(new_schedule)): employee = new_schedule[i] available = available_times(employee) for time_slot in available: new_schedule[i]['schedule'] = [(i, j) for (i, j) in employee['schedule'] if (i, j) != time_slot] new_cost = calculate_cost(new_schedule) if new_cost < calculate_cost(schedule): schedule = new_schedule break else: continue break else: break return schedule # 主函数,生成一个随机的排班表并优化它 def main(): schedule = generate_random_schedule() print('初始排班表:') for employee in schedule: print(employee['name'], employee['schedule']) print('初始成本:', calculate_cost(schedule)) optimized = optimize_schedule(schedule) print('优化后的排班表:') for employee in optimized: print(employee['name'], employee['schedule']) print('最终成本:', calculate_cost(optimized)) if __name__ == '__main__': main() ``` 这个算法会根据员工的工作时长限制和不能工作的时间段,生成一份随机的排班表。然后,它会尝试优化这个排班表,直到达到最小成本。优化过程中,算法会遍历每个员工和每个可用时间段,尝试将该员工的排班表中的某个时间段替换成一个可用时间段,然后计算新排班表的成本是否更小。如果是,则使用新排班表进行下一轮优化。如果达到最小成本后,算法会返回最终的优化排班表。 请注意,这个实现是非常简单的,并且可能并不适用于所有排班问题。在实际应用中,您可能需要对算法进行更多的调整和优化,以适应您的具体需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值