Python 内存
内存泄漏和内存溢出
定义与区别
-
内存泄漏 (Memory Leak)
- 定义:在使用动态分配的内存时,某些已分配的内存块无法被释放,导致程序占用的内存不断增加,最终耗尽内存。
- 原因:
- 全局变量:长时间存在的全局变量会占用内存。
- 闭包:闭包可能会捕获外部变量,导致这些变量无法被释放。
- 循环引用:对象之间相互引用,垃圾回收器无法回收这些对象。
- 检测工具:
memory_profiler:分析内存使用情况。objgraph:可视化对象引用关系,找出内存泄漏。
-
内存溢出 (Memory Overflow)
- 定义:程序占用的内存超过了系统可用的内存量,导致程序崩溃或系统性能下降。
- 原因:
- 大数据集:处理大量数据时,内存占用超过系统限制。
- 递归调用:无限递归导致栈溢出。
- 循环引用:对象之间相互引用,垃圾回收器无法回收。
- 避免方法:
- 使用生成器或迭代器:逐步处理大数据集。
- 减少对象引用:及时解除引用,避免循环引用。
- 增加系统内存限制:增加物理内存或使用更大的虚拟内存。
- 优化算法和数据结构:选择高效的算法和数据结构。
- 使用第三方库或工具:如
tracemalloc、psutil等。
with 语句
工作原理
with语句:用于管理资源,确保资源在使用后被正确释放。- 工作流程:
- 暂存
__exit__方法:with语句先暂存了对象的__exit__方法。 - 调用
__enter__方法:with语句调用对象的__enter__方法,该方法打开资源(如文件)并返回资源对象。 - 使用资源:在
with块中使用资源对象(如文件句柄)。 - 调用
__exit__方法:with语句调用之前暂存的__exit__方法,该方法关闭资源(如文件)。
- 暂存
示例
class File:
def __init__(self, filename, mode):
self.file = open(filename, mode)
def __enter__(self):
return self.file
def __exit__(self, exc_type, exc_val, exc_tb):
self.file.close()
with File('example.txt', 'w') as opened_file:
opened_file.write('Hello, World!')
- 步骤:
- 暂存
__exit__方法:with语句暂存File对象的__exit__方法。 - 调用
__enter__方法:__enter__方法打开文件并返回文件句柄。 - 使用文件句柄:在
with块中使用opened_file写入数据。 - 调用
__exit__方法:__exit__方法关闭文件。
- 暂存
散列函数 (Hash Function)
定义与作用
- 定义:将任意长度的数据(通常是字符串)转换为一个固定长度的数字(哈希值)的函数。
- 作用:
- 数据存储:在哈希表中存储和检索数据。
- 数据比较:通过比较哈希值判断数据是否“相似”。
- 数据压缩:将数据“压缩”成较短的哈希值。
特性
-
雪崩效应 (Avalanche Effect)
- 定义:不同的输入数据产生不同的哈希值。
- 重要性:确保哈希值的差异性,减少冲突。
-
均匀分布 (Uniform Distribution)
- 定义:对于大量的输入数据,输出的哈希值在预定范围内均匀分布。
- 重要性:提高数据检索效率,减少哈希冲突。
-
确定性 (Deterministic)
- 定义:相同的输入总是产生相同的输出。
- 重要性:确保数据的一致性和可重复性。
哈希冲突 (Hash Collision)
- 定义:不同的输入数据产生相同的哈希值。
- 处理方法:
- 链地址法 (Chaining):每个哈希表槽位存储一个链表,链表中存储所有哈希值相同的元素。
- 开放地址法 (Open Addressing):在哈希表中寻找下一个空槽位存储冲突的元素。
示例
import hashlib
# 创建一个哈希对象
hash_object = hashlib.sha256()
# 更新哈希对象的数据
hash_object.update(b'Hello, World!')
# 获取哈希值
hash_value = hash_object.hexdigest()
print(hash_value) # 输出: a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e
- 步骤:
- 创建哈希对象:使用
hashlib.sha256()创建一个 SHA-256 哈希对象。 - 更新数据:使用
update()方法更新哈希对象的数据。 - 获取哈希值:使用
hexdigest()方法获取哈希值。
- 创建哈希对象:使用

浙公网安备 33010602011771号