Python 内存

内存泄漏和内存溢出

定义与区别

  1. 内存泄漏 (Memory Leak)

    • 定义:在使用动态分配的内存时,某些已分配的内存块无法被释放,导致程序占用的内存不断增加,最终耗尽内存。
    • 原因
      • 全局变量:长时间存在的全局变量会占用内存。
      • 闭包:闭包可能会捕获外部变量,导致这些变量无法被释放。
      • 循环引用:对象之间相互引用,垃圾回收器无法回收这些对象。
    • 检测工具
      • memory_profiler:分析内存使用情况。
      • objgraph:可视化对象引用关系,找出内存泄漏。
  2. 内存溢出 (Memory Overflow)

    • 定义:程序占用的内存超过了系统可用的内存量,导致程序崩溃或系统性能下降。
    • 原因
      • 大数据集:处理大量数据时,内存占用超过系统限制。
      • 递归调用:无限递归导致栈溢出。
      • 循环引用:对象之间相互引用,垃圾回收器无法回收。
    • 避免方法
      • 使用生成器或迭代器:逐步处理大数据集。
      • 减少对象引用:及时解除引用,避免循环引用。
      • 增加系统内存限制:增加物理内存或使用更大的虚拟内存。
      • 优化算法和数据结构:选择高效的算法和数据结构。
      • 使用第三方库或工具:如 tracemallocpsutil 等。

with 语句

工作原理

  • with 语句:用于管理资源,确保资源在使用后被正确释放。
  • 工作流程
    1. 暂存 __exit__ 方法with 语句先暂存了对象的 __exit__ 方法。
    2. 调用 __enter__ 方法with 语句调用对象的 __enter__ 方法,该方法打开资源(如文件)并返回资源对象。
    3. 使用资源:在 with 块中使用资源对象(如文件句柄)。
    4. 调用 __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!')
  • 步骤
    1. 暂存 __exit__ 方法with 语句暂存 File 对象的 __exit__ 方法。
    2. 调用 __enter__ 方法__enter__ 方法打开文件并返回文件句柄。
    3. 使用文件句柄:在 with 块中使用 opened_file 写入数据。
    4. 调用 __exit__ 方法__exit__ 方法关闭文件。

散列函数 (Hash Function)

定义与作用

  • 定义:将任意长度的数据(通常是字符串)转换为一个固定长度的数字(哈希值)的函数。
  • 作用
    • 数据存储:在哈希表中存储和检索数据。
    • 数据比较:通过比较哈希值判断数据是否“相似”。
    • 数据压缩:将数据“压缩”成较短的哈希值。

特性

  1. 雪崩效应 (Avalanche Effect)

    • 定义:不同的输入数据产生不同的哈希值。
    • 重要性:确保哈希值的差异性,减少冲突。
  2. 均匀分布 (Uniform Distribution)

    • 定义:对于大量的输入数据,输出的哈希值在预定范围内均匀分布。
    • 重要性:提高数据检索效率,减少哈希冲突。
  3. 确定性 (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
  • 步骤
    1. 创建哈希对象:使用 hashlib.sha256() 创建一个 SHA-256 哈希对象。
    2. 更新数据:使用 update() 方法更新哈希对象的数据。
    3. 获取哈希值:使用 hexdigest() 方法获取哈希值。
posted @ 2024-02-25 14:20  nn_ning  阅读(51)  评论(0)    收藏  举报