Skip to main content

Python memory tracing.

Project description

pymemtrace provides tools for tracking and understanding Python memory usage at different levels, at different granularities and with different runtime costs.

Full documentation: https://pymemtrace.readthedocs.io

pymemtrace Tools

The tools provided by pymemtrace are:

process_tree

A command line tool that shows the total memory usage of a process and its child processes at regular time intervals. It can log this data to a JSON file for later analysis. See some process_tree examples

process

A very lightweight way of logging the total memory usage of a single process at regular time intervals. It can plot memory over time with plotting programs such as gnuplot. See some process examples

cPyMemTrace

This module, written in C, provides real time logging of Python and C actions:

  • pymemtrace.cPyMemTrace.Profile is a memory tracer written in C that can report total memory usage for every function call/return for both C and Python sections. This is more suitable for logging C code, for example Python’s C extensions.

  • pymemtrace.cPyMemTrace.Trace is a memory tracer written in C that can report total memory usage for every function call/return/line for Python sections. This is more suitable for logging pure Python code.

  • pymemtrace.cPyMemTrace.ReferenceTracing can report every object allocation and de-allocation with Reference Tracing. This is quite invasive but the API allows this to filter out most of the noise or target specific types of interest. (Python 3.13+ only).

See some cPyMemTrace examples and a technical note on cPyMemTrace.

DTrace

There are a number of D scripts that can trace the low level malloc() and free() system calls and report how much memory was allocated and by whom. See some DTrace examples and a technical note on DTrace.

trace_malloc

A convenience wrapper around the Python standard library tracemalloc module. This can report Python memory usage by module and line compensating for the cost of tracemalloc. This can take memory snapshots before and after code blocks and show the change on memory caused by that code. See some trace_malloc examples

debug_malloc_stats

Awrapper around the sys._debugmallocstats function that can take snapshots of memory before and after code execution and report the significant differences of the Python small object allocator. See some debug_malloc_stats examples

Tool Characteristics

Each tool can be characterised by:

  • Memory Granularity: In how much detail is a memory change is observed. An example of coarse memory granularity is measuring the Resident Set Size (RSS) which is normally in chunks of 4096 bytes. An example of fine memory granularity is recording every malloc() and free().

  • Execution Granularity: In how much code detail is the memory change observed. An example of coarse execution granularity is measuring the memory usage every second. An example of fine execution granularity is recording the memory usage every Python line.

  • Memory Cost: How much extra memory the tool needs.

  • Execution Cost: How much the execution time is increased.

Clearly there are trade-offs between these depending on the problem you are trying to solve.

Firstly granularity:

Tool Granularity

Tool

Memory Granularity

Execution Granularity

process_tree

RSS.

Regular time intervals.

process

RSS.

Regular time intervals.

cPyMemTrace.Profile

RSS.

Per Python line, Python function and return. C function call and return.

cPyMemTrace.Trace

RSS.

Per Python line, Python function and return. Python Opcode and exception.

cPyMemTrace.ReferenceTracing

RSS.

Every object allocation/de-allocation.

DTrace

Every malloc() and free().

Per function call and return.

trace_malloc

Every Python object.

Per Python line, per function call.

debug_malloc_stats

Python memory pool.

Snapshots the CPython memory pool either side of a block of code.

Secondly cost:

Tool Cost

Tool

Memory Cost

Execution Cost

process_tree

Near zero.

Near zero.

process

Near zero.

Near zero.

cPyMemTrace.Profile

Near zero.

10x to 40x.

cPyMemTrace.Trace

Near zero.

20x to 60x.

cPyMemTrace.ReferenceTracing

Near zero.

2x to 80x.

DTrace

Minimal.

90x to 100x.

trace_malloc

Significant but compensated.

900x for small objects, 6x for large objects.

debug_malloc_stats

Minimal.

+2000x for small objects, 12x for large objects.

Installation

To install pymemtrace, run this command in your terminal:

$ pip install pymemtrace

Licence

Python memory tracing.

Credits

Phil Smith (AHL) with whom a casual lunch time chat lead to the creation of an earlier, but quite different implementation, of cPyMemTrace in pure Python.

This package was created with Cookiecutter and the audreyr/cookiecutter-pypackage project template.

History

0.4.0 (2026-04-18)

  • cPyMemTrace:
    • User filtering of Reference Tracing events to include/exclude specific events.

    • Reference Tracing runs the Garbage Collector on exit to make the log more accurate.

    • Much more reliable processing of Reference Tracing events.

    • Fix the issue with Reference Tracing where handling type “frame” and “code” was causing pytest and CPython runtime assert failures.

    • Write profile/trace/reference tracing context switches to the appropriate log file.

    • Add cPyMemTrace.ReferenceTracingSimple as an example. Includes documentation and test code.

    • Add suspend() and resume() methods for Reference Tracing.

    • Document pytest issues with Reference Tracing (now historical information).

  • General documentation improvements, now around 140 PDF A4 pages.

  • Add Doxygen documentation of the C source.

  • Supported Python versions are: 3.8, 3.9, 3.10, 3.11, 3.12, 3.13, 3.14, 3.15

  • Development Status :: 5 - Production/Stable

0.3.1 (2026-03-23)

  • pymemtrace:
    • Add decorator for pymemtrace.process.

    • pymemtrace.process can now summarise JSON in the log to stdout.

  • cPyMemTrace:
    • Add decorators for Python functions for Profile, Trace and ReferenceTracing.

    • Fix a SIGSEGV when bad keyword arguments were passed to cPyMemTrace.ReferenceTracing.

0.3.0 (2026-03-19)

  • Add process-tree.py for logging a process and its children.

  • cPyMemTrace:
    • Add Reference Tracing (Python 3.13+) that can record every object allocation or de-allocation.

    • Add an option to log to a specific file.

    • Add an API write_message_to_log() to inject text into the log file.

    • Better structure of the log file format.

    • Define the log file format.

    • Add debug exploration code with debug_cPyMemtrace().

    • Fix stacking pop() issue with trace/profile functions with linked list of tTraceFileWrapperLinkedList.

  • Add support for Python 3.14

  • Remove support for Python 3.7

  • Supported Python versions are: 3.8, 3.9, 3.10, 3.11, 3.12, 3.13, 3.14

  • Development Status :: 5 - Production/Stable

0.2.0 (2024-11-17)

  • cPyMemTrace:
    • Add P/T, stack depth and python version to log file name, example: "20241107_195847_62264_P_0_PY3.13.0b3.log"

    • Add stacking of trace/profile functions with linked list of tTraceFileWrapperLinkedList.

    • Add an option to log to a specific file.

    • Add an API write_to_log() to inject text into the log file.

    • Add an optional message to the log file in cPyMemTrace.

    • Add Python API to get log file being written to by cPyMemTrace.

    • Bug fixes in cPyMemTrace.c

    • Safety fix for file path name lengths.

    • Fix for log files where '#' was being concatenated.

0.1.7 (2024-09-12)

  • Minor fix for a single test.

0.1.6 (2024-09-11)

  • Add support for Python versions 3.12, 3.13. Now supports Python versions 3.7, 3.8, 3.9, 3.10, 3.11, 3.12, 3.13.

0.1.5 (2023-06-21)

  • Add support for Python versions 3.10, 3.11. Now supports Python versions 3.7, 3.8, 3.9, 3.10, 3.11.

0.1.4 (2022-03-19)

  • Fix Linux build.

0.1.3 (2022-03-17)

  • Fix some tests.

0.1.2 (2022-03-17)

  • Fix source distribution that had missing headers.

0.1.1 (2020-11-17)

  • Add cPyMemTrace the C level profiler.

  • Add DTrace scripts for low level tracing.

  • Add debug_malloc_stats the wrapper around sys._debugmallocstats.

  • Add process.py from the TotalDepth project.

  • Add redirect_stdout for debug_malloc_stats.

  • Add trace_malloc, a wrapper around the tracemalloc module.

  • Includes extensive documentation and performance measurement.

  • First release on PyPI.

0.1.0 (2017-12-04)

  • Initial idea and implementation, never released.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pymemtrace-0.4.0.tar.gz (7.8 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

pymemtrace-0.4.0-cp315-cp315-macosx_10_15_universal2.whl (147.5 kB view details)

Uploaded CPython 3.15macOS 10.15+ universal2 (ARM64, x86-64)

pymemtrace-0.4.0-cp314-cp314-macosx_10_15_universal2.whl (147.3 kB view details)

Uploaded CPython 3.14macOS 10.15+ universal2 (ARM64, x86-64)

pymemtrace-0.4.0-cp313-cp313-macosx_10_13_universal2.whl (147.0 kB view details)

Uploaded CPython 3.13macOS 10.13+ universal2 (ARM64, x86-64)

pymemtrace-0.4.0-cp312-cp312-macosx_10_13_universal2.whl (131.7 kB view details)

Uploaded CPython 3.12macOS 10.13+ universal2 (ARM64, x86-64)

pymemtrace-0.4.0-cp311-cp311-macosx_10_9_universal2.whl (131.5 kB view details)

Uploaded CPython 3.11macOS 10.9+ universal2 (ARM64, x86-64)

pymemtrace-0.4.0-cp310-cp310-macosx_10_9_universal2.whl (131.4 kB view details)

Uploaded CPython 3.10macOS 10.9+ universal2 (ARM64, x86-64)

pymemtrace-0.4.0-cp39-cp39-macosx_10_9_universal2.whl (131.4 kB view details)

Uploaded CPython 3.9macOS 10.9+ universal2 (ARM64, x86-64)

pymemtrace-0.4.0-cp38-cp38-macosx_11_0_universal2.whl (131.2 kB view details)

Uploaded CPython 3.8macOS 11.0+ universal2 (ARM64, x86-64)

File details

Details for the file pymemtrace-0.4.0.tar.gz.

File metadata

  • Download URL: pymemtrace-0.4.0.tar.gz
  • Upload date:
  • Size: 7.8 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.0

File hashes

Hashes for pymemtrace-0.4.0.tar.gz
Algorithm Hash digest
SHA256 e2e8506edc1fa374656e57055f47ea1353333fff3493064bd710491c9d6e1b3f
MD5 49741660f89e236c3cbb12ea727bbc68
BLAKE2b-256 ba8a2d5f14ac4c91adfa71f9609ccd1f53811602535212251d940cb91cf6ecaf

See more details on using hashes here.

File details

Details for the file pymemtrace-0.4.0-cp315-cp315-macosx_10_15_universal2.whl.

File metadata

File hashes

Hashes for pymemtrace-0.4.0-cp315-cp315-macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 305673973ab5ea2c90254f2bdf76b7ccf5a068a0caa9f72c7c463a069e153e35
MD5 2a6be4786553cdb9b5700a15294d0755
BLAKE2b-256 577fbbc674edf4b539e469595ea5aff2db3aed0fba9dc0fbd8e20030a5d8f663

See more details on using hashes here.

File details

Details for the file pymemtrace-0.4.0-cp314-cp314-macosx_10_15_universal2.whl.

File metadata

File hashes

Hashes for pymemtrace-0.4.0-cp314-cp314-macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 ac94ae9f759231c2e57c8c903006ac9c6172d50e39f447f328a4d83ed43b970b
MD5 f2a9ab64e1a1d5148e9e74bad8809566
BLAKE2b-256 0e90f8822c047433fc99237dce018007c10f09f990e7169ca7b3804027ea7bbb

See more details on using hashes here.

File details

Details for the file pymemtrace-0.4.0-cp313-cp313-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for pymemtrace-0.4.0-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 ccbf0bd3ec45af6541e239bef766103d175b3ac37f0040bdd13678d839669c17
MD5 87db9e3e7a0af5b6a6541cca143f6997
BLAKE2b-256 5a19704440662386f9420fd9275386b30c091137568f4dd0e74f46d31b097787

See more details on using hashes here.

File details

Details for the file pymemtrace-0.4.0-cp312-cp312-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for pymemtrace-0.4.0-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 e7a237a877b160108d52ac0a9832f388c953eea7a4fb8e5abe2f8ef928375c20
MD5 a33a2421ff2e68702531c6246e07b5d5
BLAKE2b-256 d192f6e36fc3c3c36e5c72d8fbd8ac3a9b8051e801c0ea461559065dda170770

See more details on using hashes here.

File details

Details for the file pymemtrace-0.4.0-cp311-cp311-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for pymemtrace-0.4.0-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 25c0bd6c912007cd28a538d17af79c05899302bf3990fadc1f8d037c88b3f2b4
MD5 ae94dd0d71f1735a66061b659dabd2f1
BLAKE2b-256 7add58933a16b2c722c8d7661262865a0ce4abda64c63dce8d38164ab85839e2

See more details on using hashes here.

File details

Details for the file pymemtrace-0.4.0-cp310-cp310-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for pymemtrace-0.4.0-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 a1f96f530f5e6086a8b123bf42df312b34420809971a1240646363bd53cc9de5
MD5 d96dfd97d2a7e179110a1ee4f8b7280c
BLAKE2b-256 8b94886437a5e6ca0b5eb596be361a58081efd454e23a94b02439d1635c18ffe

See more details on using hashes here.

File details

Details for the file pymemtrace-0.4.0-cp39-cp39-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for pymemtrace-0.4.0-cp39-cp39-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 d4acefcb5804e36df3e6524e75655e52bb19d2bf65f84628f99ec08293759804
MD5 a1f4fa2bb7c3909f88ac280704a4ae38
BLAKE2b-256 72e0db69075027ce9743c6ded92eb1707e4aa6e1ae4e092890919870ef06cbc9

See more details on using hashes here.

File details

Details for the file pymemtrace-0.4.0-cp38-cp38-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for pymemtrace-0.4.0-cp38-cp38-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 963d2ab769a06547b926ca8e0b5bb14a9020ce314d8a25e57960761542a727d0
MD5 129e85815d6656560e9df59b22266d58
BLAKE2b-256 7f3465b07f4d244f38369953dfed101e6663ea260efe99e1f879f67cde04e33a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page