【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.11 视图与副本:内存优化的双刃剑
2.11 视图与副本:内存优化的双刃剑
目录
2.11.1 视图创建条件检测
在 NumPy 中,数组操作可以创建视图或副本。视图不创建新的数据副本,而是共享原始数组的数据,因此对内存占用较小。副本则会创建新的数据副本,占用更多的内存。了解视图和副本的创建条件对于优化内存使用至关重要。
- 视图与副本的区别:视图和副本的基本概念。
- 视图创建条件:哪些操作会创建视图。
- 副本创建条件:哪些操作会创建副本。
- 检测方法:如何检测视图和副本。
import numpy as np# 创建一个原始数组
a = np.array([1, 2, 3, 4, 5, 6])# 视图操作
b = a[1:4] # 使用切片操作创建视图
print(f"b 是否是 a 的视图: {np.may_share_memory(a, b)}") # 检测 b 是否是 a 的视图# 副本操作
c = a.copy() # 使用 copy 方法创建副本
print(f"c 是否是 a 的副本: {np.may_share_memory(a, c)}") # 检测 c 是否是 a 的副本
2.11.2 副本深度拷贝机制
副本的深度拷贝机制确保了数据的独立性,但在处理大数组时会消耗较多内存。了解深度拷贝的实现原理和优化方法可以提高代码性能。
- 深度拷贝的实现原理:
copy
方法的实现原理。 - 优化方法:如何优化深度拷贝操作。
- 使用
np.ascontiguousarray
:优化内存布局。
import numpy as np# 创建一个原始数组
a = np.array([[1, 2, 3], [4, 5, 6]])# 深度拷贝
b = a.copy()
b[0, 0] = 10 # 修改副本中的值
print(f"原始数组 a: \n{a}") # 原始数组不受影响
print(f"副本数组 b: \n{b}") # 副本数组被修改# 使用 np.ascontiguousarray 优化内存布局
c = np.ascontiguousarray(a)
print(f"优化后的数组 c: \n{c}") # 确保内存连续
2.11.3 内存占用实时监控
实时监控内存占用可以帮助你及时发现并解决内存泄漏问题。使用 memory_profiler
工具可以方便地进行内存监控。
- memory_profiler 安装:如何安装
memory_profiler
。 - 内存监控方法:使用
memory_profiler
进行内存监控。 - 内存泄漏检测:如何检测内存泄漏。
# 使用 memory_profiler 进行内存监控
from memory_profiler import profile@profile
def memory_intensive_function():a = np.random.rand(10000, 10000) # 创建一个大数组b = a.copy() # 创建副本del a # 删除原始数组c = b[1:1000, 1:1000] # 创建视图del b # 删除副本return cresult = memory_intensive_function()
print(f"结果数组: \n{result}") # 输出结果数组
2.11.4 内存泄漏预防
内存泄漏是指程序在运行过程中未能释放不再使用的内存,导致内存占用不断增加。了解内存泄漏的原因和预防方法可以提高代码的稳定性和性能。
- 内存泄漏的原因:常见的内存泄漏原因。
- 预防方法:如何预防内存泄漏。
- 使用 Dask 进行内存管理:Dask 的内存管理机制。
import numpy as np
import dask.array as da# 创建一个大数组
a = np.random.rand(10000, 10000)# 使用 Dask 进行内存管理
dask_a = da.from_array(a, chunks=(1000, 1000)) # 分块处理数组
print(f"Dask 数组: \n{dask_a}") # 输出 Dask 数组# 计算平均值
mean_result = dask_a.mean().compute() # 计算并释放中间结果
print(f"平均值: {mean_result}") # 输出平均值
2.11.5 Dask集成案例
Dask 是一个并行计算库,可以与 NumPy 集成以处理大规模数据。通过 Dask,可以有效地管理内存,避免内存溢出。
- Dask 基本概念:Dask 的基本概念和工作原理。
- Dask 与 NumPy 集成:如何将 Dask 与 NumPy 集成。
- 性能比较:Dask 与纯 NumPy 的性能比较。
import numpy as np
import dask.array as da
import time# 创建一个大数组
np_a = np.random.rand(10000, 10000)# 使用 Dask 创建分块数组
dask_a = da.from_array(np_a, chunks=(1000, 1000))# 计算平均值(NumPy)
start_time = time.time()
np_mean = np_a.mean()
np_time = time.time() - start_time
print(f"使用 NumPy 计算平均值: {np_mean}, 用时: {np_time:.2f}秒")# 计算平均值(Dask)
start_time = time.time()
dask_mean = dask_a.mean().compute()
dask_time = time.time() - start_time
print(f"使用 Dask 计算平均值: {dask_mean}, 用时: {dask_time:.2f}秒")# 比较内存占用
import tracemalloctracemalloc.start()
np_a = np.random.rand(10000, 10000)
np_current, np_peak = tracemalloc.get_traced_memory()
tracemalloc.stop()tracemalloc.start()
dask_a = da.from_array(np.random.rand(10000, 10000), chunks=(1000, 1000))
dask_mean = dask_a.mean().compute()
dask_current, dask_peak = tracemalloc.get_traced_memory()
tracemalloc.stop()print(f"使用 NumPy 的内存峰值: {np_peak / 1024 / 1024:.2f} MB")
print(f"使用 Dask 的内存峰值: {dask_peak / 1024 / 1024:.2f} MB")
2.11.6 总结
- 关键收获:理解视图与副本的创建条件,掌握深度拷贝机制,学会内存占用实时监控方法。
- 最佳实践:合理使用视图和副本,及时释放不再使用的内存,避免内存泄漏。
- 工具和库:使用
memory_profiler
进行内存监控,使用 Dask 进行大规模数据处理。
通过本文,我们深入探讨了 NumPy 中视图与副本的创建条件,副本的深度拷贝机制,内存占用的实时监控方法,内存泄漏的预防技巧,以及 Dask 与 NumPy 的集成案例。希望这些内容能帮助你在实际开发中更好地优化内存使用,提高代码性能,避免常见的内存陷阱。
2.11.7 参考文献
参考资料 | 链接 |
---|---|
《NumPy Beginner’s Guide》 | NumPy Beginner’s Guide |
《Python for Data Analysis》 | Python for Data Analysis |
NumPy 官方文档 | NumPy Reference |
Dask 官方文档 | Dask Documentation |
Stack Overflow | How to detect memory leaks in NumPy |
Medium | Understanding NumPy Views and Copies |
Python Memory Management | Python Memory Management |
SciPy 官方文档 | SciPy Memory Efficiency |
Wikipedia | Memory Leaks |
《高性能Python》 | High Performance Python |
《Python数据科学手册》 | Python Data Science Handbook |
这篇文章包含了详细的原理介绍、代码示例、源码注释以及案例等。希望这对您有帮助。如果有任何问题请随私信或评论告诉我。
相关文章:
【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.11 视图与副本:内存优化的双刃剑
2.11 视图与副本:内存优化的双刃剑 目录 #mermaid-svg-OpelXRXip4Xj1A2e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-OpelXRXip4Xj1A2e .error-icon{fill:#552222;}#mermaid-svg-OpelXRXip4Xj1A2e .…...
React 封装高阶组件 做路由权限控制
React 高阶组件是什么 官方解释∶ 高阶组件(HOC)是 React 中用于复用组件逻辑的一种高级技巧。HOC 自身不是 React API 的一部分,它是一种基于 React 的组合特性而形成的设计模式。 高阶组件(HOC)就是一个函数&…...
Python sider-ai-api库 — 访问Claude、llama、ChatGPT、gemini、o1等大模型API
目前国内少有调用ChatGPT、Claude、Gemini等国外大模型API的库。 Python库sider_ai_api 提供了一个完整的解决方案。通过调用 sider.ai 的API,开发者可以实现对这些大模型的访问。 众所周知,sider是一个Chrome,以及Edge的浏览器插件…...
深入解析 Linux 内核内存管理核心:mm/memory.c
在 Linux 内核的众多组件中,内存管理模块是系统性能和稳定性的关键。mm/memory.c 文件作为内存管理的核心实现,承载着页面故障处理、页面表管理、内存区域映射与取消映射等重要功能。本文将深入探讨 mm/memory.c 的设计思想、关键机制以及其在内核中的作用,帮助读者更好地理…...
git基础使用--3---git安装和基本使用
git基础使用–3–git-安装和基本使用 1. git工具安装 使用git如果不考虑开发工具我们一般需要关注三个点 1.1 git 本地化仓库管理的基础 打开https://git-scm.com/downloads地址下载安装 安装完成后,配置环境变量 配置完打开cmd,输入git --versio…...
Python 网络爬虫实战:从基础到高级爬取技术
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 1. 引言 网络爬虫(Web Scraping)是一种自动化技术,利用程序从网页中提取数据,广泛…...
【PyQt】学习PyQt进行GUI开发从基础到进阶逐步掌握详细路线图和关键知识点
学习PyQt的必要性 PyQt是开发跨平台GUI应用的强大工具,适合需要构建复杂、高性能界面的开发者。无论是职业发展还是项目需求,学习PyQt都具有重要意义。 1. 跨平台GUI开发 跨平台支持:PyQt基于Qt框架,支持Windows、macOS、Linux…...
Web - CSS3基础语法与盒模型
概述 这篇文章是关于 Web 前端 CSS3 的基础语法与盒模型的讲解。包括 CSS3 层叠性及处理冲突规则、伪元素和新增伪类元素、属性选择器等。还介绍了文本与字体属性,如段落和行相关属性、字体文本属性。最后阐述了盒子模型,如元素隐藏、行内与块元素转换、…...
【开源免费】基于Vue和SpringBoot的公寓报修管理系统(附论文)
本文项目编号 T 186 ,文末自助获取源码 \color{red}{T186,文末自助获取源码} T186,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...
成绩案例demo
本案例较为简单,用到的知识有 v-model、v-if、v-else、指令修饰符.prevent .number .trim等、computed计算属性、toFixed方法、reduce数组方法。 涉及的功能需求有:渲染、添加、删除、修改、统计总分,求平均分等。 需求效果如下:…...
【tiktok 国际版抖抖♬♬ __ac_signature算法】逆向分析
一开始的参数是没有X-Bogus和 __ac_signature的 先是加密请求参数得到乱码。最终得到X-Bogus 然后请求参数添加了X-Bogus之后再去生成__ac_signature __ac_signature的生成需要用到X-Bogus...
【Linux】动静态库
一、库 静态库 .a[Linux]、.lib[windows] 动态库 .so[Linux]、.dll[windows] 二、静态库使用 如果我们要做一个静态库的话,首先我们需要把我们源文件(.c/.cpp)隐藏起来,头文件(.h)必须暴露出来, 1.我们先要把我们所有的.c文件编译成.o文件…...
《手札·开源篇》从开源到商业化:中小企业的低成本数字化转型路径 ——以Odoo为数据中台低成本实现售前售中一体化
某机电设备有限公司数字化转型案例:以Odoo为数据中台实现售前售中一体化 一、企业背景某机电设备有限公司在机电设备领域历经多年发展,业务广泛,涵盖工业自动化设备、电力设备等产品的销售与服务。随着业务版图不断拓展,企业面临…...
携程Android开发面试题及参考答案
在项目中,给别人发的动态点赞功能是如何实现的? 数据库设计:首先要在数据库中为动态表添加一个点赞字段,用于记录点赞数量,同时可能需要一个点赞关系表,记录用户与动态之间的点赞关联,包括点赞时间等信息。界面交互:在 Android 界面上,为点赞按钮设置点击事件监听器。…...
Python-列表
3.1 列表是什么 在Python中,列表是一种非常重要的数据结构,用于存储一系列有序的元素。列表中的每个元素都有一个索引,索引从0开始。列表可以包含任何类型的元素,包括其他列表。 # 创建一个列表my_list [1, 2, 3, four, 5.0]…...
【LeetCode 刷题】回溯算法-子集问题
此博客为《代码随想录》二叉树章节的学习笔记,主要内容为回溯算法子集问题相关的题目解析。 文章目录 78.子集90.子集II 78.子集 题目链接 class Solution:def subsets(self, nums: List[int]) -> List[List[int]]:res, path [], []def dfs(start: int) ->…...
31.Word:科技论文的译文审交稿【31】
目录 NO1.2.3 NO4.5.6 NO7.8样式应用和修改&多级列表 NO9奇偶页页眉 NO10自动编号&交叉引用 NO11.12 NO1.2.3 另存为/F12:考生文件夹只保留译文内容、格式设置、修订批注,删除其他:删除表格的左列→删除第一行将表格转化成…...
Java序列化详解
1 什么是序列化、反序列化 在Java编程实践中,当我们需要持久化Java对象,比如把Java对象保存到文件里,或是在网络中传输Java对象时,序列化机制就发挥着关键作用。 序列化:指的是把数据结构或对象转变为可存储、可传输的…...
尝试ai生成figma设计
当听到用ai 自动生成figma设计时,不免好奇这个是如何实现的。在查阅了不少资料后,有了一些想法。参考了:在figma上使用脚本自动生成色谱 这篇文章提供的主要思路是:可以通过脚本的方式构建figma设计。如果我们使用ai 生成figma脚本…...
每日一题——包含min函数的栈
包含min函数的栈 题目数据范围:示例C语言代码实现解释1. push(value)2. pop()3. top()4. min() 总结大小堆GPT给的原始代码 题目 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的 min 函数,输入操作时保证 pop、top 和 mi…...
【最后203篇系列】004 -Smarklink
说明 这个用来替代nginx。 最初是希望用nginx进行故障检测和负载均衡,花了很多时间,大致的结论是:nginx可以实现,但是是在商业版里。非得要找替代肯定可以搞出来,但是太麻烦了(即使是nginx本身的配置也很烦…...
二分法模板
数组具有二段性,可以分为左右两边合法区和不合法区 如果选择左端点,右边区域不合法,选择 left mid ,right mid - 1; 如果选择右端点,左边区域不合法,选择 left mid 1 ,right mid ; 1.x 的平方根 LCR 072. x 的…...
基于SpringBoot的智慧康老疗养院管理系统的设计与实现(源码+SQL脚本+LW+部署讲解等)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
LabVIEW无人机航线控制系统
介绍了一种无人机航线控制系统,该系统利用LabVIEW软件与MPU6050九轴传感器相结合,实现无人机飞行高度、速度、俯仰角和滚动角的实时监控。系统通过虚拟仪器技术,有效实现了数据的采集、处理及回放,极大提高了无人机航线的控制精度…...
STM32CUBEIDE编译的hex使用flymcu下载后不能运行
测试后确认,不论是1.10版本还是1.16版本,编译生成的hex下载后不能运行,需要更改boot 设置才能开始运行,flymcu下载后已经告知一切正常,跳转到8000 0000处开始运行,实际没有反应,而使用mdk编译生…...
final-关键字
一、final修饰的类不能被继承 当final修饰一个类时,表明这个类不能被其他类继承。例如,在 Java 中,String类就是被final修饰的,这保证了String类的不可变性和安全性,防止其他类通过继承来改变String类的行为。 final…...
在RHEL 8.10上安装开源工业物联网解决方案Thingsboard 3.9
在RHEL/CentOS/Rocky/AlmaLinux/Oracle Linux 8单节点上安装 备注: 适用于单节点 是否支持欧拉??? 前提条件 本指南描述了如何在RHEL/CentOS 7/8上安装ThingsBoard。硬件要求取决于所选的数据库和连接到系统的设备数量。要在单…...
deepseek+vscode自动化测试脚本生成
近几日Deepseek大火,我这里也尝试了一下,确实很强。而目前vscode的AI toolkit插件也已经集成了deepseek R1,这里就介绍下在vscode中利用deepseek帮助我们完成自动化测试脚本的实践分享 安装AI ToolKit并启用Deepseek 微软官方提供了一个针对AI辅助的插件,也就是 AI Toolk…...
k8s支持自定义field-selector spec.hostNetwork过滤
好久没写博客啦,年前写一个博客就算混过去啦😂 写一个小功能,对于 Pod,在没有 label 的情况下,支持 --field-selector spec.hostNetwork 查询 Pod 是否为 hostNetwork 类型,只为了熟悉 APIServer 是如何构…...
图像噪声处理技术:让图像更清晰的艺术
在这个数字化时代,图像作为信息传递的重要载体,其质量直接影响着我们的视觉体验和信息解读。然而,在图像采集、传输或处理过程中,难免会遇到各种噪声干扰,如高斯噪声、椒盐噪声等,这些噪声会降低图像的清晰…...
w186格障碍诊断系统spring boot设计与实现
🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…...
【自学笔记】Java的重点知识点-持续更新
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 Java知识点概览一、Java简介二、Java基本语法三、面向对象编程(OOP)四、异常处理五、常用类库六、多线程编程七、网络编程 注意事项 总结 Ja…...
031.关于后续更新和指纹浏览器成品
关于后续更新 后续决定不再更新了,我低估了各种检测站的更新速度,我开源的一些源码修改方法,已经被个别检测网站加入了针对性检测。只要开源了,一段时间后就会有针对性反检测。这种东西根本就不能开源,开源了大家就一…...
013-51单片机红外遥控器模拟控制空调,自动制冷制热定时开关
主要功能是通过红外遥控器模拟控制空调,可以实现根据环境温度制冷和制热,能够通过遥控器设定温度,可以定时开关空调。 1.硬件介绍 硬件是我自己设计的一个通用的51单片机开发平台,可以根据需要自行焊接模块,这是用立创…...
UE5 蓝图学习计划 - Day 10:UI 系统(HUD 与 Widget)
在游戏开发中,UI(用户界面) 是玩家获取游戏信息、与游戏进行交互的重要部分。Unreal Engine 5 提供了 HUD(Head-Up Display) 和 Widget Blueprint(小部件蓝图) 来帮助开发者创建 血量条、得分系…...
QT简单实现验证码(字符)
0) 运行结果 1) 生成随机字符串 Qt主要通过QRandomGenerator类来生成随机数。在此之前的版本中,qrand()函数也常被使用,但从Qt 5.10起,推荐使用更现代化的QRandomGenerator类。 在头文件添加void generateRandomNumb…...
代码随想录刷题笔记
数组 二分查找 ● 704.二分查找 tips:两种方法,左闭右开和左闭右闭,要注意区间不变性,在判断mid的值时要看mid当前是否使用过 ● 35.搜索插入位置 ● 34.在排序数组中查找元素的第一个和最后一个位置 tips:寻找左右边…...
VSCode 中的 Git Graph扩展使用详解
VSCode 中的 Git Graph 详解 1. 什么是 Git Graph? Git Graph 是 VSCode 中的一款 Git 可视化扩展,它提供了一种 图形化方式 来查看 Git 提交历史、分支、合并记录等信息,使得 Git 版本管理更加直观和高效。 通过 Git Graph,你…...
Day07:缓存-数据淘汰策略
Redis的数据淘汰策略有哪些 ? (key过期导致的) 在redis中提供了两种数据过期删除策略 第一种是惰性删除,在设置该key过期时间后,我们不去管它,当需要该key时,我们再检查其是否过期,如果过期&…...
【自学嵌入式(8)天气时钟:天气模块开发、主函数编写】
天气时钟:天气模块开发、主函数编写 I2C协议和SPI协议I2C(Inter-Integrated Circuit)SPI(Serial Peripheral Interface) 天气模块心知天气预报使用HTTPClient类介绍主要功能常用函数注意事项 JSON介绍deserializeJson函…...
简单的SQL语句的快速复习
语法的执行顺序 select 4 字段列表 from 1 表名列表 where 2 条件列表 group by 3 分组前过滤 having 分组后过滤 order by 5 排序字段列表 limit 6 分页参数 聚合函数 count 统计数量 max 最大值 min 最小值 avg 平均 sum 总和 分组查询使…...
跟李沐学AI:视频生成类论文精读(Movie Gen、HunyuanVideo)
Movie Gen:A Cast of Media Foundation Models 简介 Movie Gen是Meta公司提出的一系列内容生成模型,包含了 3.2.1 预训练数据 Movie Gen采用大约 100M 的视频-文本对和 1B 的图片-文本对进行预训练。 图片-文本对的预训练流程与Meta提出的 Emu: Enh…...
Rust 所有权特性详解
Rust 所有权特性详解 Rust 的所有权系统是其内存安全的核心机制之一。通过所有权规则,Rust 在编译时避免了常见的内存错误(如空指针、数据竞争等)。本文将从堆内存与栈内存、所有权规则、变量作用域、String 类型、内存分配、所有权移动、Cl…...
基于人脸识别的课堂考勤系统
该项目是一个基于人脸识别的课堂考勤系统,使用Python开发,结合了多种技术实现考勤功能。要开发类似的基于人脸识别的考勤系统,可参考以下步骤: 环境搭建:利用Anaconda创建虚拟环境,指定Python版本为3.8&am…...
Deepseek R1 本地化部署指南:跨平台实战
引言 Deepseek R1 作为一款强大的本地化人工智能工具,支持在多种操作系统上部署,满足开发者和企业私有化运行的需求。本文将手把手教你如何在 Windows、Linux 和 macOS 系统上完成 Deepseek R1 的本地化部署,并附赠常见问题解决技巧! © ivwdcwso (ID: u012172506) 1…...
Nginx 运维开发高频面试题详解
一、基础核心问题 原文链接:https://blog.csdn.net/weixin_51146329/article/details/142963853 1、什么是Nginx? Nginx 是一个高性能的 HTTP 和反向代理服务器,它以轻量级和高并发处理能力而闻名。Nginx 的反向代理功能允许它作为前端服务…...
JVM运行时数据区域-附面试题
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域 有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是 依赖用户线程的启动和结束而建立和销毁。 1. 程序计…...
DeepSeek本地部署详细指南
DeepSeek本地部署详细指南 随着人工智能技术的飞速发展,本地部署大模型的需求也日益增加。DeepSeek作为一款开源且性能强大的大语言模型,提供了灵活的本地部署方案,让用户能够在本地环境中高效运行模型,同时保护数据隐私。以下是…...
Debian 10 中 Linux 4.19 内核在 x86_64 架构上对中断嵌套的支持情况
一、中断嵌套的定义与原理 中断嵌套是指在一个中断处理程序(ISR)正在执行的过程中,另一个更高优先级的中断请求到来,系统暂停当前中断处理程序,转而处理新的高优先级中断。处理完高优先级中断后,系统返回到原来的中断处理程序继续执行。这种机制允许系统更高效地响应紧急…...
C语言:深入了解指针1
内存和地址 1. 酒店房间类比内存和地址 场景描述 把计算机的内存想象成一家酒店,每个房间就是一个内存单元,每个房间都有一个唯一的房间号,这个房间号就相当于内存地址。房间里可以存放客人的行李等物品,这些物品就好比存储在内…...