Python Tracemalloc 模块

2024 年 8 月 29 日 | 阅读 15 分钟

在以下教程中,我们将通过一些示例讨论 Python 编程语言的 tracemalloc 模块。

Tracemalloc 是一个从 Python 3.4 版本开始可用的模块,它允许我们监控 Python 代码中的内存分配。它允许我们在特定点拍摄内存快照,对快照执行不同的统计,并执行两个快照之间的差异以检查两个快照之间的对象分配。

以下教程将帮助我们理解 tracemalloc 模块的应用程序编程接口 (API) 的使用,以跟踪 Python 代码中的内存消耗并执行不同的操作。我们还将通过不同的示例了解通过 tracemalloc 模块可用的不同类、方法和属性的用法。

那么,让我们开始吧。

了解 Python tracemalloc 模块

tracemalloc 模块是一个调试工具,用于工具 Python 分配的内存块。它提供以下信息

  1. 分配对象的追溯
  2. 按文件名和行号划分的已分配内存块统计信息:已分配内存块的总大小、数量和平均大小
  3. 计算两个快照之间的差异以检测内存泄漏

我们必须尽早启动 tracemalloc 模块,以跟踪 Python 编程语言分配的大多数内存块。我们可以通过将 PYTHONTRACEMALLOC 环境变量设置为 1 或借助 -X tracemalloc 命令行选项来实现。可以在运行时调用 tracemalloc 模块的 start() 函数以开始跟踪 Python 内存分配。

默认情况下,分配的内存块的跟踪只存储最近的帧(1 帧)。我们可以通过将 PYTHONTRACEMALLOC 环境变量设置为 25 或使用 -X tracemalloc = 25 命令行选项在启动时存储 25 帧。

现在让我们了解 tracemalloc 模块提供的一些类和方法。

了解 tracemalloc 模块的类和方法

  1. 以下是 Python tracemalloc 模块提供的一些类和方法
  2. start() - 此方法用于开始内存跟踪。它接受一个名为 nframe 的整数参数,该参数指定每次调用要分配的帧数。默认值为 1
  3. take_snapshot() - 此方法拍摄内存快照并返回 Snapshot 对象。
  4. statistics() - 我们可以使用 Snapshot 对象访问此方法,并接受一个键作为输入来对跟踪记录进行排序。此方法返回一个迭代器,其中包含 Statistic 对象的列表。单个 Statistic 对象包含与单个追溯(通常是单行代码)相关的详细信息,其中包括在该追溯中记录的对象数量及其大小。以下是此方法接受作为输入的键列表
    1. filename:此属性允许该方法按文件名对跟踪进行排序。
    2. lineno:此属性允许该方法按文件中行号对跟踪进行排序。
    3. traceback:此属性允许该方法按跟踪顺序对跟踪进行排序。
  5. traceback - Statistic 对象的此属性用于返回 Traceback 类的对象。Traceback 具有与单个跟踪相关的详细信息,该跟踪可以具有多个帧 (Frame)。
  6. format() - 此方法用于将追溯格式化为为此追溯跟踪的行列表。
  7. get_traceback_limit() - 此方法用于返回一个整数,指定单个追溯中存储的最大帧数。我们可以在 tracemalloc.start() 方法中指定每个追溯要记录的最大帧总数。
  8. get_object_traceback() - 此方法接受单个对象作为输入,并用于返回一个 traceback 对象,指定此对象的追溯是在哪里拍摄的。
  9. get_traced_memory() - 此方法用于返回一个由两个整数组成的元组,指定跟踪块的当前大小和峰值大小(以字节为单位)。
  10. get_tracemalloc_memory() - 此方法用于返回一个整数,指定 tracemalloc 模块使用的内存(以字节为单位)。
  11. is_tracing() - 此方法用于返回一个布尔值,指示跟踪是否正在进行或已停止。
  12. stop() - 此方法用于停止 tracemalloc 模块接受跟踪。
  13. clear_traces() - 此方法用于清除从 start() 方法开始的所有跟踪。有必要确保跟踪信息仍然可用于已拍摄的 Snapshot 对象;但是,如果在此方法之后调用 take_snapshot() 方法,则它将不可用。
  14. dump() - 此方法接受文件名作为输入以存储跟踪信息。
  15. load() - 此方法接受文件名作为输入,从中加载跟踪信息。
  16. DomainFilter - 此类允许我们通过处理对象的地址空间来过滤跟踪。它接受两个参数作为输入。
    1. domain - 此参数接受一个整数值,指定内存块的地址空间。Python 内存跟踪通常使用整数 0;但是,对于 C,该数字会有所不同。
    2. inclusive - 此参数接受一个布尔值,指定是否包含或排除由域属性提及的跟踪。
  17. Filter - 此类允许我们根据文件名、行号和域的组合过滤跟踪。它有多个参数,如下所示
    1. domain - 此属性接受一个整数值,指定内存块的地址空间。Python 内存跟踪通常使用整数 0;但是,对于 C,该数字会有所不同。
    2. filename_pattern - 此属性接受一个字符串值,指定文件名将在跟踪中匹配的模式,并根据 inclusive 标志,它们将被包含或排除。
    3. lineno - 此属性接受一个整数值,指定要包含具有该行号的跟踪。
      1. inclusive - 此属性接受一个布尔值,指定是否包含或排除由 domain、filename_patternlineno 属性提及的跟踪。
    4. all_frames - 此属性接受一个布尔标志,指定是否包含每次跟踪的所有帧。
  18. compare_to() - 我们可以在任何快照对象上调用此方法,将其传递给另一个快照对象,以获取两个快照之间的差异。它还接受 key_type 参数作为输入,我们将利用它作为主键来找出两个快照之间的差异。它将返回一个 StatisticDiff 类的对象。此对象包含与差异相关的信息。

现在我们将通过一些示例了解上述类和方法的用法。

tracemalloc 模块的一些示例

现在让我们考虑一些示例,演示 tracemalloc 模块的类和方法的工作原理。

示例 1

在以下示例中,我们将了解 tracemalloc 模块的 start()、take_snapshot()statistics() 方法的用法。

代码

输出

D:\Python_programs\tracOne.py:7: size=583 KiB, count=14994, average=40 B
D:\Python_programs\tracOne.py:6: size=528 KiB, count=14984, average=36 B
D:\Python_programs\tracOne.py:5: size=522 KiB, count=14745, average=36 B

说明

在上面的代码片段中,我们导入了 tracemalloc 模块。然后,我们使用 start() 方法开始跟踪,然后创建了三个整数列表。然后,我们拍摄了一个内存快照,并打印了该快照从追溯开始收集的追溯列表。

示例 2

在以下示例中,我们将了解 format()、get_traceback_limit()、get_object_traceback()、get_object_memory()、get_tracemalloc_memory()is_tracing() 等方法的用法。

代码

输出

========== THE SNAPSHOT =============
D:\Python_programs\tracTwo.py:8: size=583 KiB, count=14994, average=40 B
['  File "D:\\Python_programs\\tracTwo.py", line 8', '    listThree = [n*n*n for n in range(15000)]']
D:\Python_programs\tracTwo.py:7: size=528 KiB, count=14984, average=36 B
['  File "D:\\Python_programs\\tracTwo.py", line 7', '    listTwo = [n*n for n in range(15000)]']
D:\Python_programs\tracTwo.py:6: size=522 KiB, count=14744, average=36 B
['  File "D:\\Python_programs\\tracTwo.py", line 6', '    listOne = [n for n in range(15000)]']
D:\Python_programs\tracTwo.py:9: size=6544 B, count=3, average=2181 B
['  File "D:\\Python_programs\\tracTwo.py", line 9', '    listFour = np.random.randint(1, 150, (1500,))']
<__array_function__ internals>:5: size=528 B, count=1, average=528 B
['  File "<__array_function__ internals>", line 5']
C:\Users\khans\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\numpy\core\fromnumeric.py:3051: size=520 B, count=1, average=520 B
['  File "C:\\Users\\khans\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python39\\site-packages\\numpy\\core\\fromnumeric.py", line 3051', "    return _wrapreduction(a, np.multiply, 'prod', axis, dtype, out,"]
<__array_function__ internals>:4: size=456 B, count=1, average=456 B
['  File "<__array_function__ internals>", line 4']
C:\Users\khans\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\numpy\core\fromnumeric.py:70: size=440 B, count=1, average=440 B
['  File "C:\\Users\\khans\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python39\\site-packages\\numpy\\core\\fromnumeric.py", line 70', '    passkwargs = {k: v for k, v in kwargs.items()']
D:\Python_programs\tracTwo.py:11: size=424 B, count=1, average=424 B
['  File "D:\\Python_programs\\tracTwo.py", line 11', '    ss = tm.take_snapshot()']

=========== USEFUL METHODS ===========

Traceback Limit :  25  Frames

Allocation Location for List l4 :  D:\Python_programs\tracTwo.py:9

Traced Memory (Current, Peak):  (2000444, 2019653)

Memory Usage by tracemalloc Module :  2585088  bytes

Tracing Status :  True

说明

在上面的代码片段中,我们导入了 tracemalloc 模块。然后,我们使用 start() 方法开始跟踪,然后创建了四个整数列表。然后,我们拍摄了一个内存快照,并使用上述方法执行了不同的操作,并以所需的模式返回了信息。

示例 3

在以下示例中,我们将了解 stop() 方法以及 clear_traces() 方法的实现。

代码

输出

================ SNAPSHOT ONE =================
D:\Python_programs\tracThree.py:5: size=51.5 MiB, count=1499745, average=36 B
D:\Python_programs\tracThree.py:7: size=583 KiB, count=14994, average=40 B
D:\Python_programs\tracThree.py:6: size=528 KiB, count=14984, average=36 B

================ SNAPSHOT 2 =================
D:\Python_programs\tracThree.py:5: size=51.5 MiB, count=1499745, average=36 B
D:\Python_programs\tracThree.py:15: size=642 KiB, count=14998, average=44 B
D:\Python_programs\tracThree.py:7: size=583 KiB, count=14994, average=40 B
D:\Python_programs\tracThree.py:6: size=528 KiB, count=14984, average=36 B
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:226: size=896 B, count=3, average=299 B      
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:173: size=816 B, count=2, average=408 B      
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:505: size=656 B, count=3, average=219 B      
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:423: size=576 B, count=4, average=144 B      
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:533: size=576 B, count=1, average=576 B      
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:498: size=528 B, count=3, average=176 B      
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:560: size=472 B, count=2, average=236 B      
D:\Python_programs\tracThree.py:12: size=456 B, count=1, average=456 B
D:\Python_programs\tracThree.py:13: size=448 B, count=1, average=448 B
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:59: size=440 B, count=1, average=440 B       
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:535: size=416 B, count=1, average=416 B      
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:207: size=416 B, count=1, average=416 B      
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:53: size=416 B, count=1, average=416 B       
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:501: size=408 B, count=1, average=408 B      
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:499: size=168 B, count=1, average=168 B      
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:193: size=144 B, count=3, average=48 B       
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:67: size=128 B, count=2, average=64 B        
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:315: size=104 B, count=2, average=52 B       
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:485: size=64 B, count=1, average=64 B        
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:484: size=64 B, count=1, average=64 B        
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:54: size=64 B, count=1, average=64 B
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:558: size=56 B, count=1, average=56 B        
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:26: size=56 B, count=1, average=56 B
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:212: size=37 B, count=2, average=18 B        
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:503: size=28 B, count=1, average=28 B        
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:502: size=28 B, count=1, average=28 B        
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:58: size=24 B, count=1, average=24 B
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:21: size=24 B, count=1, average=24 B

================ SNAPSHOT 3 =================
D:\Python_programs\tracThree.py:25: size=526 KiB, count=14873, average=36 B

Tracing Status :  True

Tracing Status :  False

Trying to Take Snapshot After Tracing is Stopped.
Exception :  the tracemalloc module must be tracing memory allocations to take a snapshot

说明

在上面的代码片段中,我们首先在创建三个整数列表后拍摄了一个快照。然后,我们创建了另一个列表并再次拍摄了快照。然后,我们清除了所有跟踪,这些跟踪是自开始以来创建的四个列表的跟踪。然后,我们创建了第五个列表并再次拍摄了快照。我们还可以从输出中了解到,第三个快照只包含有关创建的第五个列表的信息,并且之前的所有跟踪都已清除。最后,我们还展示了 stop() 方法的用法。

示例 4

在以下示例中,我们将了解 dump()load() 方法的实现。

代码

输出

D:\Python_programs\tracFour.py:7: size=583 KiB, count=14994, average=40 B
D:\Python_programs\tracFour.py:6: size=528 KiB, count=14984, average=36 B
D:\Python_programs\tracFour.py:5: size=522 KiB, count=14745, average=36 B

Loaded Snapshot From File :
D:\Python_programs\tracFour.py:7: size=583 KiB, count=14994, average=40 B
D:\Python_programs\tracFour.py:6: size=528 KiB, count=14984, average=36 B
D:\Python_programs\tracFour.py:5: size=522 KiB, count=14745, average=36 B

说明

在上面的代码片段中,我们创建了三个列表并拍摄了一个快照。然后,我们为用户打印了统计信息。然后,我们使用 dump() 方法将跟踪信息存储在 snap.out 文件中。然后,我们使用 load() 方法从 snap.out 文件中加载存储的跟踪信息,并为用户打印了统计信息。

示例 5

在以下示例中,我们将通过从 tracemalloc 模块记录的所有跟踪列表中过滤跟踪来了解 DomainFilterFilter 类的实现。

代码

输出

========== The Original Snapshot ===========
D:\Python_programs\tracFive.py:8: size=583 KiB, count=14994, average=40 B
D:\Python_programs\tracFive.py:6: size=528 KiB, count=14984, average=36 B
D:\Python_programs\tracFive.py:9: size=525 KiB, count=14872, average=36 B
D:\Python_programs\tracFive.py:7: size=522 KiB, count=14744, average=36 B
D:\Python_programs\tracFive.py:10: size=6544 B, count=3, average=2181 B
<__array_function__ internals>:5: size=528 B, count=1, average=528 B
C:\Users\khans\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\numpy\core\fromnumeric.py:3051: size=520 B, count=1, average=520 B
<__array_function__ internals>:4: size=456 B, count=1, average=456 B
C:\Users\khans\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\numpy\core\fromnumeric.py:70: size=440 B, count=1, average=440 B
D:\Python_programs\tracFive.py:12: size=424 B, count=1, average=424 B

========= Filtered Snapshot - One =============
D:\Python_programs\tracFive.py:8: size=583 KiB, count=14994, average=40 B
D:\Python_programs\tracFive.py:6: size=528 KiB, count=14984, average=36 B
D:\Python_programs\tracFive.py:9: size=525 KiB, count=14872, average=36 B
D:\Python_programs\tracFive.py:7: size=522 KiB, count=14744, average=36 B
D:\Python_programs\tracFive.py:10: size=544 B, count=2, average=272 B
<__array_function__ internals>:5: size=528 B, count=1, average=528 B
C:\Users\khans\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\numpy\core\fromnumeric.py:3051: size=520 B, count=1, average=520 B
<__array_function__ internals>:4: size=456 B, count=1, average=456 B
C:\Users\khans\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\numpy\core\fromnumeric.py:70: size=440 B, count=1, average=440 B
D:\Python_programs\tracFive.py:12: size=424 B, count=1, average=424 B

========= Filtered Snapshot - Two =============
D:\Python_programs\tracFive.py:10: size=6000 B, count=1, average=6000 B

========= Filtered Snapshot - Three =============

========= Filtered Snapshot - Four =============
D:\Python_programs\tracFive.py:8: size=583 KiB, count=14994, average=40 B
D:\Python_programs\tracFive.py:6: size=528 KiB, count=14984, average=36 B
D:\Python_programs\tracFive.py:9: size=525 KiB, count=14872, average=36 B
D:\Python_programs\tracFive.py:7: size=522 KiB, count=14744, average=36 B
D:\Python_programs\tracFive.py:10: size=6544 B, count=3, average=2181 B
<__array_function__ internals>:5: size=528 B, count=1, average=528 B
C:\Users\khans\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\numpy\core\fromnumeric.py:3051: size=520 B, count=1, average=520 B
<__array_function__ internals>:4: size=456 B, count=1, average=456 B
C:\Users\khans\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\numpy\core\fromnumeric.py:70: size=440 B, count=1, average=440 B
D:\Python_programs\tracFive.py:12: size=424 B, count=1, average=424 B

说明

在上面的代码片段中,我们了解了过滤器的使用。第一个快照包含 Python 使用的内存块中的所有跟踪。第二个快照包含 Python 创建的内存块的跟踪。这可能是因为 C,因为 NumPy 是基于它构建的。第三个快照包含文件名是 tracFive.py 的条目,第四个快照排除了文件名是 tracFive.py 的条目。

示例 6

在以下示例中,我们将了解比较两个快照并使用 compare_to() 方法查找它们之间跟踪差异的方法。

代码

输出

SNAPSHOT - ONE
D:\Python_programs\tracSix.py:7: size=583 KiB, count=14994, average=40 B
D:\Python_programs\tracSix.py:6: size=528 KiB, count=14984, average=36 B
D:\Python_programs\tracSix.py:5: size=522 KiB, count=14745, average=36 B

SNAPSHOT - TWO
D:\Python_programs\tracSix.py:17: size=645 KiB, count=14998, average=44 B
D:\Python_programs\tracSix.py:16: size=642 KiB, count=14998, average=44 B
D:\Python_programs\tracSix.py:7: size=583 KiB, count=14994, average=40 B
D:\Python_programs\tracSix.py:6: size=528 KiB, count=14984, average=36 B
D:\Python_programs\tracSix.py:5: size=522 KiB, count=14745, average=36 B
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:226: size=848 B, count=2, average=424 B      
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:173: size=816 B, count=2, average=408 B      
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:533: size=576 B, count=1, average=576 B      
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:498: size=528 B, count=3, average=176 B      
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:423: size=512 B, count=3, average=171 B      
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:505: size=488 B, count=2, average=244 B      
D:\Python_programs\tracSix.py:12: size=456 B, count=1, average=456 B
D:\Python_programs\tracSix.py:13: size=448 B, count=1, average=448 B
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:59: size=440 B, count=1, average=440 B       
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:535: size=416 B, count=1, average=416 B      
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:207: size=416 B, count=1, average=416 B      
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:53: size=416 B, count=1, average=416 B       
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:501: size=408 B, count=1, average=408 B      
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:193: size=144 B, count=3, average=48 B       
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:560: size=48 B, count=1, average=48 B        
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:315: size=40 B, count=1, average=40 B        
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:212: size=37 B, count=2, average=18 B        
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:503: size=28 B, count=1, average=28 B        
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:502: size=28 B, count=1, average=28 B        

DIFFERENCE
D:\Python_programs\tracSix.py:17: size=645 KiB (+645 KiB), count=14998 (+14998), average=44 B
D:\Python_programs\tracSix.py:16: size=642 KiB (+642 KiB), count=14998 (+14998), average=44 B
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:226: size=848 B (+848 B), count=2 (+2), average=424 B
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:173: size=816 B (+816 B), count=2 (+2), average=408 B
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:533: size=576 B (+576 B), count=1 (+1), average=576 B
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:498: size=528 B (+528 B), count=3 (+3), average=176 B
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:423: size=512 B (+512 B), count=3 (+3), average=171 B
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:505: size=488 B (+488 B), count=2 (+2), average=244 B
D:\Python_programs\tracSix.py:12: size=456 B (+456 B), count=1 (+1), average=456 B
D:\Python_programs\tracSix.py:13: size=448 B (+448 B), count=1 (+1), average=448 B
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:59: size=440 B (+440 B), count=1 (+1), average=440 B
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:535: size=416 B (+416 B), count=1 (+1), average=416 B
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:207: size=416 B (+416 B), count=1 (+1), average=416 B
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:53: size=416 B (+416 B), count=1 (+1), average=416 B
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:501: size=408 B (+408 B), count=1 (+1), average=408 B
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:193: size=144 B (+144 B), count=3 (+3), average=48 B
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:560: size=48 B (+48 B), count=1 (+1), average=48 B
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:315: size=40 B (+40 B), count=1 (+1), average=40 B
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:212: size=37 B (+37 B), count=2 (+2), average=18 B
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:503: size=28 B (+28 B), count=1 (+1), average=28 B
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\tracemalloc.py:502: size=28 B (+28 B), count=1 (+1), average=28 B
D:\Python_programs\tracSix.py:7: size=583 KiB (+0 B), count=14994 (+0), average=40 B
D:\Python_programs\tracSix.py:6: size=528 KiB (+0 B), count=14984 (+0), average=36 B
D:\Python_programs\tracSix.py:5: size=522 KiB (+0 B), count=14745 (+0), average=36 B

说明

在上面的代码片段中,我们创建了三个列表并拍摄了第一个快照。然后,我们为用户打印了统计信息。我们添加了另外两个列表,拍摄了另一个快照,并打印了其统计信息。最后,我们使用 compare_to() 方法找到了两个快照之间的差异,并将其打印给用户。

示例 7

以下示例与上一个示例完全相同;但是,唯一的区别是我们将使用过滤器删除与 tracemalloc 模块本身相关的条目。

代码

输出

SNAPSHOT - ONE
D:\Python_programs\tracSeven.py:7: size=583 KiB, count=14994, average=40 B
D:\Python_programs\tracSeven.py:6: size=528 KiB, count=14984, average=36 B
D:\Python_programs\tracSeven.py:5: size=522 KiB, count=14745, average=36 B

SNAPSHOT - TWO
D:\Python_programs\tracSeven.py:16: size=645 KiB, count=14998, average=44 B
D:\Python_programs\tracSeven.py:15: size=642 KiB, count=14998, average=44 B
D:\Python_programs\tracSeven.py:7: size=583 KiB, count=14994, average=40 B
D:\Python_programs\tracSeven.py:6: size=528 KiB, count=14984, average=36 B
D:\Python_programs\tracSeven.py:5: size=522 KiB, count=14745, average=36 B
D:\Python_programs\tracSeven.py:12: size=456 B, count=1, average=456 B
D:\Python_programs\tracSeven.py:13: size=448 B, count=1, average=448 B

DIFFERENCE
D:\Python_programs\tracSeven.py:16: size=645 KiB (+645 KiB), count=14998 (+14998), average=44 B
D:\Python_programs\tracSeven.py:15: size=642 KiB (+642 KiB), count=14998 (+14998), average=44 B
D:\Python_programs\tracSeven.py:12: size=456 B (+456 B), count=1 (+1), average=456 B
D:\Python_programs\tracSeven.py:13: size=448 B (+448 B), count=1 (+1), average=448 B
D:\Python_programs\tracSeven.py:7: size=583 KiB (+0 B), count=14994 (+0), average=40 B
D:\Python_programs\tracSeven.py:6: size=528 KiB (+0 B), count=14984 (+0), average=36 B
D:\Python_programs\tracSeven.py:5: size=522 KiB (+0 B), count=14745 (+0), average=36 B

说明

在上面的代码片段中,我们创建了三个列表并拍摄了第一个快照。然后,我们为用户打印了统计信息。我们添加了另外两个列表,拍摄了另一个快照,并打印了其统计信息。然后,我们使用 Filter 类定义了一个过滤器。我们将 tracemalloc 文件名 (tracemalloc.__file__) 指定给 Filter 类的 filename_pattern 属性,并将 inclusive 属性设置为 False 以排除与 tracemalloc 模块相关的条目。最后,我们使用 compare_to() 方法找到了两个快照之间的差异,并将其打印给用户。