Python 提供了一种内存管理机制来跟踪内存使用情况。可以使用 Python 内置的 tracemalloc
模块来跟踪 Python 程序的内存使用情况。下面是使用tracemalloc
进行内存跟踪的完整攻略。
安装tracemalloc
tracemalloc
是 Python3 中的标准库,因此无需安装。
使用tracemalloc跟踪内存
import tracemalloc
# 开始跟踪内存
tracemalloc.start()
# 需要跟踪内存的代码
a = [i * 2 for i in range(10_000)]
# 停止跟踪内存
tracemalloc.stop()
上述代码中,我们使用 tracemalloc
函数将内存跟踪功能打开,然后执行代码,最后关闭内存跟踪功能。
使用 tracemalloc
进行内存跟踪后,我们可以获取程序执行期间内存使用的详细信息。我们可以使用 tracemalloc
模块的 get_traced_memory()
函数获得程序执行期间使用的内存量。此函数将返回一个元组,其中包含当前使用的内存和峰值内存。
import tracemalloc
# 开始跟踪内存
tracemalloc.start()
# 需要跟踪内存的代码
a = [i * 2 for i in range(10_000)]
# 获取内存使用量
memory_used = tracemalloc.get_traced_memory()
# 停止跟踪内存
tracemalloc.stop()
print(f"当前内存使用: {memory_used[0] / 10**6} MB")
print(f"内存峰值: {memory_used[1] / 10**6} MB")
上述代码中,我们使用 tracemalloc
函数将内存跟踪功能打开,然后执行代码 a = [i * 2 for i in range(10_000)]
,最后使用 tracemalloc.get_traced_memory()
函数获取内存使用情况。我们还打印了内存使用和内存峰值。最后,我们使用 tracemalloc.stop()
函数关闭内存跟踪功能。
示例1:内存泄漏追踪
import tracemalloc
import gc
class MyClass:
def __init__(self):
self.data = [i ** 2 for i in range(10_000)]
# 打开内存跟踪功能
tracemalloc.start(10)
# 创建对象列表
objs = []
for i in range(1_000):
obj = MyClass()
objs.append(obj)
# 收集不再使用的对象并释放它们所占用的内存
del objs
gc.collect()
# 获取内存使用信息
memory_used = tracemalloc.get_traced_memory()
# 关闭内存跟踪功能
tracemalloc.stop()
print(f"当前内存使用量: {memory_used[0] / 10**6} MB")
print(f"内存峰值: {memory_used[1] / 10**6} MB")
上述代码中,我们创建了 MyClass
类作为测试对象,并将 1000 个对象保存到 objs
列表变量中。在 objs
列表中删除所有对象并调用 gc.collect()
函数来回收内存。最终,我们使用 tracemalloc.get_traced_memory()
函数获取内存使用信息,并使用 tracemalloc.stop()
函数关闭内存跟踪功能。
如果内存泄漏,tracemalloc
将此程序行为映射到内存消耗,并且可以在验证了结果之后通过正常配置[或程序更改]进行修复。
示例2:比较内存占用
import tracemalloc
# 打开内存跟踪功能
tracemalloc.start(10)
# 创造一个 100MB 大小的数组
array1 = [0] * (10 ** 5 * 100//8)
# 获取内存跟踪信息
memory1 = tracemalloc.get_traced_memory()
# 一个更小的数组
array2 = [0] * (10 ** 5 * 1//8)
# 再次获取内存跟踪信息
memory2 = tracemalloc.get_traced_memory()
# 停止内存跟踪
tracemalloc.stop()
print(f"创建 100MB 数组使用 {memory1[0] / 10**6} MB")
print(f"创建 1MB 数组使用 {memory2[0] / 10**6} MB")
上述代码中,我们使用 tracemalloc
函数将内存跟踪功能打开,然后创建具有不同大小的两个数组,记录内存使用情况,最后关闭内存跟踪功能。使用内存跟踪功能可以更直观地看到差异。在本示例中,我们创建的 100MB 大小数组比1MB 的数组使用更多的内存。
总之,Python 中内存跟踪功能十分强大,能帮助定位内存泄漏等问题,并可以提高程序的性能。