关于python中内存分配的问题,运行一些操作可能会导致为新结果分配内存,用Python的id()函数演示

一、考虑背景:

一般在python中不会考虑像C++中的内存问题,但是在一些高级应用中会考虑,例如有一个特别特别大的矩阵,最好不要不断的赋值,导致内存问题产生。

二、python中的id:

在python中有个id()函数, 它给我们提供了内存中引用对象的确切地址,这个id就像C++中的指针,id在python中表示object的唯一标识号。

三、代码演示:

1.有如下代码:Y的 id 存在变量before中,把Y+X在赋值为Y(相当于又创建了一次Y),这个Y的 id 和之前Y的 id 是不相同的。

#创建 X、Y
X = torch.arange(12,dtype = torch.float32).reshape(3,4)
Y = torch.tensor([[2.0,1,4,3],[1,2,3,4],[4,3,2,1]])before = id(Y)
print('id(Y):',id(Y))
Y = Y + X
print('id(Y):',id(Y))
id(Y) == before

运行结果:
在这里插入图片描述
这可能是不可取的,原因有两个:
(1)首先,我们不想总是不必要地分配内存。在机器学习中,我们可能有数百兆的参数,并且在一秒内多次更新所有参数。通常情况下,我们希望原地执行这些更新;
(2)如果我们不原地更新,其他引用仍然会指向旧的内存位置,这样我们的某些代码可能会无意中引用旧的参数。

2.执行原地操作,使用切片表示法将操作的结果分配给先前分配的数组。首先创建一个新的矩阵Z,其形状与另一个Y相同,使用pytorch中的zeros_like来分配一个全0的块,见如下代码。

Z = torch.zeros_like(Y)
print('id(Z):',id(Z))
Z[:] = X + Y
print('id(Z):',id(Z))

运行结果:
在这里插入图片描述

3.如果在后续计算中没有重复使用X, 可以使用X[:] = X+ Y或者X += Y来减少操作的内存开销即两次的id是一样的,见如下代码。

#创建 X、Y
X = torch.arange(12,dtype = torch.float32).reshape(3,4)
Y = torch.tensor([[2.0,1,4,3],[1,2,3,4],[4,3,2,1]])before = id(Y)
print('id(Y):',id(Y))
Y +=  X
print('id(Y):',id(Y))
id(Y) == before

运行结果:
在这里插入图片描述

☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺
我是韩一,用知识认识更多的人,欢迎大家指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/188414.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jbase虚拟M层的设计

对于只是自己产品内部使用的打印程序来说(比如打印收费单,打印结算单等),打印逻辑写在js,获取其他层都是没毛病的。但是对于类型检验报告这种打印来说,打印格式控制逻辑写在js层是百分百不行的。因为检验报…

OpenAI GPT5计划泄露

OpenAI的首席执行官萨姆奥特曼在最近接受《金融时报》的专访时,分享了OpenAI未来发展的一些新动向。此外,他还透露了关于即将到来的GPT-5模型以及公司对AGI的长期目标的一些细节。 奥特曼指出: 1.OpenAI正在开发GPT-5,一种更先进的…

FullCalendar日历插件说明文档

一般标准配置 属性描述默认值header设置日历头部信息。 如果设置为false,则不显示头部信息。包括left,center,right左中右三个位置,每个位置都可以对应以下不同的配置: title: 显示当前月份/周/日信息 prev: 用于切换到上一月/周…

Postman:API测试之Postman使用完全指南

Postman是一个可扩展的API开发和测试协同平台工具,可以快速集成到CI/CD管道中。旨在简化测试和开发中的API工作流。 Postman工具有Chrome扩展和独立客户端,推荐安装独立客户端。 Postman有个workspace的概念,workspace分personal和team类型…

jetson nano的tensorrt加速部署

实验平台参数 jetack在线OTA升级指令 $ sudo vi /etc/apt/sources.list.d/nvidia-l4t-apt-source.list修改其apt源文件即可,即可可以参考上一篇文章 一,查看相应的包版本 1,jetpack版本查看 🔔sudo apt-cache show nvidia-jetpack 后面我进行了OTA在线升级,升级到4.…

LangGPT作者教你编写高质量提示词

CoT和ToT能够提升表现,但是会使得模型的使用变复杂。在对话的场景下容易消耗人的耐心;实际应用的场景下,比较消耗人的token。 还有一点需要说明的是,我们在写自己的prompt的时候,不应该盲目地追求和堆砌提示词技巧&am…

提前占领高地!2024年值得期待的UI设计原型图软件推荐

UI设计原型图软件对于产品经理、设计师来说是效率神器。一款专业的UI设计原型图软件能够帮助产品经理、设计师高效且快速地创建精美且实用的UI用户界面,从而提升UI用户界面的产品价值。本篇文章将推荐10款2024年好用的UI设计原型图软件,以帮助你更好地选…

面试其他注意事项

面试其他注意事项 一、面试反问 这个岗位的日常工作和主要职责是什么?咱们这边主要负责什么业务,用到了哪些技术呢?对于我们校招生有没有培养体系呢?脱产培训,还是边工作边熟悉?会有导师带嘛?…

YOLOv5项目实战(4)— 简单三步,教你按比例划分数据集

前言:Hello大家好,我是小哥谈。本节课就教大家如何去按照比例去划分数据集,希望大家学习之后可以有所收获!~🌈 前期回顾: YOLOv5项目实战(1)— 如何去训练模型 YOLOv5项目

ssrf学习笔记总结

SSRF概述 ​ 服务器会根据用户提交的URL 发送一个HTTP 请求。使用用户指定的URL,Web 应用可以获取图片或者文件资源等。典型的例子是百度识图功能。 ​ 如果没有对用户提交URL 和远端服务器所返回的信息做合适的验证或过滤,就有可能存在“请求伪造”的…

【备忘】在Nginx服务器安装SSL证书

您可以在Nginx或Tengine服务器上安装SSL证书,实现通过HTTPS安全访问Web服务器。本文介绍如何为Nginx或Tengine服务器安装SSL证书。 重要 本文以CentOS 8.0 64位操作系统、Nginx 1.14.2为例介绍。不同版本的操作系统或Web服务器,部署操作可能有所差异&a…

零代码编程:用ChatGPT批量转换多个视频文件夹到音频并自动移动文件夹

有很多个视频文件夹: 要全部转成音频,然后复制到另一个文件夹。 在ChatGPT中输入如下提示词: 你是一个Python编程专家,要完成一个批量将Mp4视频转为Mp3音频的任务,具体步骤如下: 打开文件夹:…