python节省内存_python_如何为创建大量实例节省内存?

案例:

某网络游戏中,定义了玩家类Player(id, name, status,....),每有一个在线玩家,在服务器程序内有一个Player的实例,当在线人数很多时,将产生大量实例(百万级别)

需求:

如何降低这些大量实例的内存开销?

如何做?

首先要明白,python中的类可以动态的添加属性,实则在内存中有个__dict__方法维护了这种动态添加属性,它占有内存,把它关掉,不就达到省内存要求了?

#!/usr/bin/python3

import time

import sys

class Player(object):

def __init__(self, id, name, status):

self.id = id

self.name = name

self.status = status

if __name__ == '__main__':

player_1 = Player(1, 'bei_bei', '上线')

print(player_1.__dict__)

print('_' * 100)

# 动态装配属性

player_1.money = 10000

player_1.__dict__['time'] = time.time()

print(player_1.__dict__)

print(player_1.money, player_1.time)

print('_' * 100)

# 打印__dict__占用的内存空间

print('dict方法占用内存:', sys.getsizeof(player_1.__dict__))

print('_'*100)

# 动态删除属性

print(player_1.__dict__)

del player_1.__dict__['time']

del player_1.money

print(player_1.__dict__)

通过__slots__属性,声明实例属性名字的列表

#!/usr/bin/python3

class Player(object):

# 通过slots方法指定类的定长属性

__slots__ = ['id', 'name', 'status']

def __init__(self, id, name, status):

self.id = id

self.name = name

self.status = status

if __name__ == '__main__':

player_1 = Player(1, 'bei_bei', '上线')

print(player_1.id, player_1.name, player_1.status)

# 尝试输出__dict__属性,发现没有,就无法动态的装配类属性,达到省内存的目的

try:

print(player_1.__dict__)

except Exception as e:

print(e)

python类与对象-如何为创建大量实例节省内存

如何为创建大量实例节省内存 问题举例 在网络游戏中,定义玩家类Player(id, name, level...), 每个玩家在线将创建一个Player实例,当在线人数很多时,将产生大量实例, 如何降 ...

python 百万级别类实例实现节省内存

# 案例: ''' 某网络游戏中,定义了玩家类Player(id,name,status) 每当有一个玩家,就会在服务器创建一个Player实例 当在线人数过多时,将产生大量实例(百万级别),消耗内存 ...

一起talk C栗子吧(第一百三十三回:C语言实例--创建进程时的内存细节)

各位看官们.大家好,上一回中咱们说的是从内存角度看进程和线程的样例.这一回咱们说的样例是:创建进程时的内存细节.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们.我们都知道使用fork函数能 ...

自己动手之使用反射和泛型,动态读取XML创建类实例并赋值

前言: 最近小匹夫参与的游戏项目到了需要读取数据的阶段了,那么觉得自己业余时间也该实践下数据相关的内容.那么从哪入手呢?因为用的是Unity3d的游戏引擎,思来想去就选择了C#读取XML文件这个小功能 ...

ESS控制台发布新功能:创建多实例规格的伸缩配置

背景 原弹性伸缩ESS服务限定,生效的伸缩配置中只能对应一种实例规格,这样就会存在如果生效的配置中的实例规格的库存不足(高配实例规格通常更容易出现库存不足的情况)时, 用户配置好的伸缩规则以及伸缩组对 ...

java内存缓存,节省内存

缓存的对象 这个问题就是我们上面提到的极端情况,在Java中,会对-128到127的Integer对象进行缓存,当创建新的Integer对象时,如果符合这个这个范围,并且已有存在的相同值的对象,则返回 ...

Oracle基础(二) 创建数据库实例

Oracle中数据库也称为数据库实例,在Oracle在安装过程中可以选择创建数据库,也可以再安装之后再进行创建. 一般创建数据库可以使用图形界面方式和SQL指令的方式,由于SQL指令方式较为复杂,这里 ...

JS高级---构造函数通过原型添加方法,原型的作用: 共享数据, 节省内存空间

JS高级---构造函数,通过原型添加方法,原型的作用: 共享数据, 节省内存空间 构造函数 //构造函数 function Person(sex, age) { this.sex = sex; thi ...

EntityFramework Core 1.1是如何创建DbContext实例的呢?

前言 上一篇我们简单讲述了在EF Core1.1中如何进行迁移,本文我们来讲讲EF Core1.1中那些不为人知的事,细抠细节,从我做起. 显式创建DbContext实例 通过带OnConfiguri ...

随机推荐

svn忽略eclipse自动生成的文件

工程目录下右键,选择“TortoiseSVN”——“Settings”菜单 选择“General”,在“Global ignore pattern”输入框的最前面添加 .settings .class ...

Swing应用开发实战系列之五:后台日志信息前台监控器

作为一个程序设计人员,我们深知日志的重要性,对于日志的监控,我们通常不外乎采用以下两种方式:日志文件方式和后台打印方式,常规情况下,这两种日志监控方式完全可以满足我们对日志监控的需要.但是,当我们用S ...

OAuth2学习及DotNetOpenAuth部分源码研究

OAuth2学习及DotNetOpenAuth部分源码研究 在上篇文章中我研究了OpenId及DotNetOpenAuth的相关应用,这一篇继续研究OAuth2. 一.什么是OAuth2 OAuth是 ...

t-sql或mssql怎么用命令行导入数据脚本

osql简单用法:用来将本地脚本执行,适合sql脚本比较大点的情况,执行起来比较方便 osql -S serverIP -U sa -P 123 -i C:\script.sql serverIP数据 ...

问题解决——使用GP-3120TN打印条形码标签

终于大致的尝试出了参数和编程手册里指令的使用. 在这里,感谢佳博中一个叫做"Gprinter 陶玮"的工程师所提供的技术支持.非常感谢,如果没有你,在写这篇文章之前我可能换别的打印 ...

如何在DJANGO里获取?带数据的东东,基于CBV

用DEF的,有现成的,而用CLASS的,就要作一下变通. 如下: if self.request.GET: if self.request.GET.get('search_pk'): search_p ...

生成AWK快照的方法

1.首先在用oracle用户登陆执行sqlplus命令用dba用户执行: exec DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT (flush_level=> ...

Vulkan Tutorial 21 Staging buffer

操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Introduction 顶点缓冲区现在已经可以正常工作,但相比于显卡内部读取数据, ...

shell脚本调用python脚本的路径问题

脚本的相互调用中,只有在同一级目录下才可以使用__file__参数去获取路径名,(在shell里使用pwd也同样),否则,使用的就是主文件(最开始运行的脚本程序)的所在位置,是错误路径:一定要注意当期 ...

C语言学习及应用笔记之六:C语言extern关键字及其使用

在C语言中,修饰符extern用在变量或者函数的声明前,用来以标识变量或者函数的定义在别的文件中,提示编译器遇到此变量或者函数时,在其它文件中寻找其定义.extern关键字的用法有几种,我们下面对其进 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值