我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python中怎么优化占用的内存

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python中怎么优化占用的内存

今天就跟大家聊聊有关Python中怎么优化占用的内存,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

Dict

使用Python内置的数据结构Dict来实现上述例子的需求很简单。

>>> ob = {'x':1, 'y':2, 'z':3}>>> x = ob['x']>>> ob['y'] = y

查看以下ob这个对象占用的内存大小:

>>> print(sys.getsizeof(ob))240

简单的三个整数,占用的内存还真不少,想象以下,如果有大量的这样的数据要存储,会占用更大的内存。

Python中怎么优化占用的内存

Class

对于喜欢面向对象编程的程序员来说,更喜欢把数据包在一个class里。使用class使用同样需求:

class Point: # def __init__(self, x, y, z): self.x = x self.y = y self.z = z>>> ob = Point(1,2,3)

class的数据结构和Dict区别就很大了,我们来看看这种情况下占用内存的情况:

Python中怎么优化占用的内存

关于 _weakref_(弱引用)可以查看这个文档, 对象的__dict__中存储了一些self.xxx的一些东西。从Python 3.3开始,key使用了共享内存存储, 减少了RAM中实例跟踪的大小。

>>> print(sys.getsizeof(ob), sys.getsizeof(ob.__dict__)) 56 112

Python中怎么优化占用的内存

可以看到内存占用量,class比dict少了一些,但这远远不够。

_slots_

从class的内存占用分布上,我们可以发现,通过消除__dict__和_weakref__,可以显着减少RAM中类实例的大小,我们可以通过使用__slots__来达到这个目的。

class Point: __slots__ = 'x', 'y', 'z' def __init__(self, x, y, z): self.x = x self.y = y self.z = z>>> ob = Point(1,2,3)>>> print(sys.getsizeof(ob))64

可以看到内存占用显著的减少了

Python中怎么优化占用的内存

默认情况下,Python的新式类和经典类的实例都有一个dict来存储实例的属性。这在一般情况下还不错,而且非常灵活,乃至在程序中可以随意设置新的属性。但是,对一些在”编译”前就知道有几个固定属性的小class来说,这个dict就有点浪费内存了。

当需要创建大量实例的时候,这个问题变得尤为突出。一种解决方法是在新式类中定义一个__slots__属性。

__slots__声明中包含若干实例变量,并为每个实例预留恰好足够的空间来保存每个变量;这样Python就不会再使用dict,从而节省空间。

那么用slot就是非非常那个有必要吗?使用__slots__也是有副作用的:

  1. 每个继承的子类都要重新定义一遍__slots__

  2. 实例只能包含哪些在__slots__定义的属性,这对写程序的灵活性有影响,比如你由于某个原因新网给instance设置一个新的属性,比如instance.a = 1, 但是由于a不在__slots__里面就直接报错了,你得不断地去修改__slots__或者用其他方法迂回的解决

  3. 实例不能有弱引用(weakref)目标,否则要记得把__weakref__放进__slots__

最后,namedlist和attrs提供了自动创建带__slot__的类,感兴趣的可以试试看。

Tuple

Python还有一个内置类型元组,用于表示不可变数据结构。 元组是固定的结构或记录,但没有字段名称。 对于字段访问,使用字段索引。 在创建元组实例时,元组字段一次性与值对象关联:

>>> ob = (1,2,3)>>> x = ob[0]>>> ob[1] = y # ERROR

元组的示例很简洁:

>>> print(sys.getsizeof(ob))72

可以看只比__slot__多8byte:

Python中怎么优化占用的内存

Namedtuple

通过namedtuple我们也可以实现通过key值来访问tuple里的元素:

Point = namedtuple('Point', ('x', 'y', 'z'))

它创建了一个元组的子类,其中定义了用于按名称访问字段的描述符。 对于我们的例子,它看起来像这样:

class Point(tuple): # @property def _get_x(self): return self[0] @property def _get_y(self): return self[1] @property def _get_y(self): return self[2] # def __new__(cls, x, y, z): return tuple.__new__(cls, (x, y, z))

此类的所有实例都具有与元组相同的内存占用。 大量实例会留下稍大的内存占用:

Python中怎么优化占用的内存

Recordclass

python的第三方库recordclassd提供了一个数据结构recordclass.mutabletuple,它几乎和内置tuple数据结构一致,但是占用更少的内存。

 >>> Point = recordclass('Point', ('x', 'y', 'z')) >>> ob = Point(1, 2, 3)

实例化以后,只少了PyGC_Head:

Python中怎么优化占用的内存

到此,我们可以看到,和__slot__比,又进一步缩小了内存占用:

Python中怎么优化占用的内存

Dataobject

recordclass提供了另外一个解决方法:在内存中使用与__slots__类相同的存储结构,但不参与循环垃圾收集机制。通过recordclass.make_dataclass可以创建出这样的实例:

>>> Point = make_dataclass('Point', ('x', 'y', 'z'))

另外一个方法是继承自dataobject

class Point(dataobject): x:int y:int z:int

以这种方式创建的类将创建不参与循环垃圾收集机制的实例。 内存中实例的结构与__slots__的情况相同,但没有PyGC_Head:

Python中怎么优化占用的内存

>>> ob = Point(1,2,3)>>> print(sys.getsizeof(ob))40

要访问这些字段,还使用特殊描述符通过其从对象开头的偏移量来访问字段,这些对象位于类字典中:

mappingproxy({'__new__': <staticmethod at 0x7f203c4e6be0>, ....................................... 'x': <recordclass.dataobject.dataslotgetset at 0x7f203c55c690>, 'y': <recordclass.dataobject.dataslotgetset at 0x7f203c55c670>, 'z': <recordclass.dataobject.dataslotgetset at 0x7f203c55c410>})

Python中怎么优化占用的内存

Cython

有一种方法基于Cython的使用。 它的优点是字段可以采用C语言原子类型的值。例如:

cdef class Python: cdef public int x, y, z def __init__(self, x, y, z): self.x = x self.y = y self.z = z

这种情况下,占用的内存更小:

>>> ob = Point(1,2,3)>>> print(sys.getsizeof(ob))32

内存结构分布如下:

Python中怎么优化占用的内存

但是,从Python代码访问时,每次都会执行从int到Python对象的转换,反之亦然。

Numpy

在纯Python的环境中,使用Numpy能带来更好的效果,例如:

>>> Point = numpy.dtype(('x', numpy.int32), ('y', numpy.int32), ('z', numpy.int32)])

创建初始值是0的数组:

 >>> points = numpy.zeros(N, dtype=Point)

Python中怎么优化占用的内存

看完上述内容,你们对Python中怎么优化占用的内存有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网行业资讯频道,感谢大家的支持。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python中怎么优化占用的内存

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python中怎么优化占用的内存

今天就跟大家聊聊有关Python中怎么优化占用的内存,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Dict使用Python内置的数据结构Dict来实现上述例子的需求很简单。>>> o
2023-06-02

Python 中怎么优化程序占用的内存

今天就跟大家聊聊有关Python 中怎么优化程序占用的内存,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。假设我现在有一个字典是这样的:animal = {Monkey: monkey
2023-06-16

如何优化Python占用的内存

概述如果程序处理的数据比较多、比较复杂,那么在程序运行的时候,会占用大量的内存,当内存占用到达一定的数值,程序就有可能被操作系统终止,特别是在限制程序所使用的内存大小的场景,更容易发生问题。下面我就给出几个优化Python占用内存的几个方法
2023-01-31

如何在Ubuntu中优化Privoxy内存占用

在Ubuntu中优化Privoxy内存占用,你可以考虑以下几个步骤:停止Privoxy服务:使用以下命令停止Privoxy服务:sudo systemctl stop privoxy编辑配置文件:打开Privoxy的配置文件,通常位于/
如何在Ubuntu中优化Privoxy内存占用
2024-10-18

python怎么写占用内存

在Python中,可以使用`sys.getsizeof()`函数来获取对象占用的内存大小。具体的代码示例如下:```pythonimport sys# 定义一个列表my_list = [1, 2, 3, 4, 5]# 获取列表占用的内存大小
2023-08-31

宝塔面板内存占用率优化

宝塔程序可以帮助我们快速搭建网站,但是笔者有一台服务器,内存只有1GB,装上宝塔后内存所剩无几,只能勉强部署一个小型服务,于是想到“精简”宝塔程序,先说结果: 初始剩余内存:218MB 优化后剩余内存:581MB 下面是具体步骤: 卸载不
2023-08-18

优化golang中Select Channels Go并发式编程的内存占用

要优化Golang中Select Channels的内存占用,可以考虑以下几点:1. 减少不必要的channel使用:在使用Select语句时,可以仅选择需要的channel进行操作,避免创建过多的channel对象。2. 使用缓冲chan
2023-10-08

python怎么查看内存占用情况

可以使用Python的内置模块`sys`来查看内存占用情况。1. 使用`sys.getsizeof()`函数来获取对象占用的内存大小。例如:```pythonimport sysmy_var = "Hello World"print(sys
2023-09-15

怎么在Linux中可视化显示内存占用情况

本篇内容主要讲解“怎么在Linux中可视化显示内存占用情况”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么在Linux中可视化显示内存占用情况”吧!物理内存不足对Linux桌面系统和服务器系统
2023-06-13

如何在PHP开发中优化代码性能和内存占用?

如何在PHP开发中优化代码性能和内存占用?在进行PHP开发时,提升代码性能和优化内存占用是非常重要的。一个高效的应用程序不仅可以提升用户体验,还可以降低服务器负载和资源消耗。本文将介绍几种优化代码性能和内存占用的方法。使用合适的数据结构和算
如何在PHP开发中优化代码性能和内存占用?
2023-11-03

redis内存占用怎么解决

优化 redis 内存占用:优化数据结构,使用更合适的数据结构;限制值大小,压缩较大值;设置过期策略,自动删除不常访问的数据;定期清除临时或过期数据,重写 aof 文件以释放空间;分片数据集到多个实例,实现负载均衡;使用 redis clu
redis内存占用怎么解决
2024-05-21

Python怎么查看程序内存占用情况

今天小编给大家分享一下Python怎么查看程序内存占用情况的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。查看程序内存占用情况
2023-06-30

python清除函数占用的内存

python升级到2.7.13函数执行的结尾加上这个即可for x in locals().keys():     del locals()[x]gc.collect()原理是,locals()会列出当前所有局部变量,手动的把当前函数生成的
2023-01-31

优化Go语言应用的内存占用和垃圾回收效率

要优化Go语言应用的内存占用和垃圾回收效率,可以采取以下几个方面的优化策略:1. 减少内存分配:避免频繁的内存分配,可以使用内存池和对象池来复用对象,减少内存分配的次数和开销。还可以使用sync.Pool来实现对象的复用,避免频繁的内存分配
2023-10-12

mysql占用内存过高怎么办

mysql 内存占用过高问题主要由过度使用查询缓存、线程缓存、临时表、索引使用不当和大型结果集等问题造成。解决办法包括禁用查询缓存、调整缓存大小、优化查询以减小临时表大小、使用连接池、优化索引策略、分批获取结果、选择适合的字符集和调整 my
mysql占用内存过高怎么办
2024-05-22

tomcat内存占用过高怎么办

当Tomcat的内存占用过高时,可以考虑以下方法来解决问题:1. 调整JVM参数:通过调整Tomcat的启动脚本中的JVM参数,例如-Xmx和-Xms参数来控制Tomcat的最大堆内存和初始堆内存大小。可以尝试将这些参数设置为适当的值,以限
2023-08-19

linux怎么查看java内存占用

要查看Java进程的内存占用情况,可以使用以下命令:1. 使用top命令查看进程的内存占用情况:```top -p ```在top命令的输出中,可以查看到Java进程的内存占用情况,包括物理内存(RES)和虚拟内存(VIRT)。2. 使用p
2023-09-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录