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.1 (2026-05-03)

  • Add example of using Reference Tracing to detect memory leaks.

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.1.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.1-cp315-cp315-macosx_10_15_universal2.whl (149.9 kB view details)

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

pymemtrace-0.4.1-cp314-cp314-macosx_10_15_universal2.whl (149.7 kB view details)

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

pymemtrace-0.4.1-cp313-cp313-macosx_10_13_universal2.whl (149.4 kB view details)

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

pymemtrace-0.4.1-cp312-cp312-macosx_10_13_universal2.whl (134.0 kB view details)

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

pymemtrace-0.4.1-cp311-cp311-macosx_10_9_universal2.whl (133.6 kB view details)

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

pymemtrace-0.4.1-cp310-cp310-macosx_10_9_universal2.whl (133.5 kB view details)

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

pymemtrace-0.4.1-cp39-cp39-macosx_10_9_universal2.whl (133.5 kB view details)

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

pymemtrace-0.4.1-cp38-cp38-macosx_11_0_universal2.whl (133.3 kB view details)

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

File details

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

File metadata

  • Download URL: pymemtrace-0.4.1.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.1.tar.gz
Algorithm Hash digest
SHA256 5a1bf8453b33f851f09e476726817942bc9b8daf1c4a4941bfb6e306a1dbad84
MD5 bc7fcfd98f0a0db36899fc133f08cce7
BLAKE2b-256 05b6f9fffbaaf63339d5e5b57855934cbc6427fdb32720682cbb3c5c3189c563

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pymemtrace-0.4.1-cp315-cp315-macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 1a307bda25b75782462be6e81004c40dc527a791329e58db06287e277e226641
MD5 bfc53966e28beab98c85ceaf78809d71
BLAKE2b-256 2d0cbf1ce6c4ad795faa7cc37201feb75977f29a410c1656cec02a4309d251a5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pymemtrace-0.4.1-cp314-cp314-macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 b8a68980ef73f9f7253655f684c37eb879127c36694197b757d287bea6c468ad
MD5 6234992691055b752ede432f9996912a
BLAKE2b-256 705f89ca64dc9dfb7980e9e13f1dc7fbd906cb6b9290dbee1ab864b6cd353a81

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pymemtrace-0.4.1-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 6259945ea092098ee06ba395b10d0f0d7aee66c781968170b8949b0b5cff830c
MD5 60cdd6fae63b50826a82937901a472b0
BLAKE2b-256 fb200690e72796d65c6e9bf318d357703067547f21cc5f097bb77bbaec7c7a01

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pymemtrace-0.4.1-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 06d819706d7871c2f89a58b039baf8d2dc4ac58e42498bd535fdaa585a31583a
MD5 092914be7052a37bef7aca77df7233e1
BLAKE2b-256 b3b3eb1b1a83614c1aad83885b2faf65ce2d4353165033690f057b1731c82a06

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pymemtrace-0.4.1-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 6b20e75567a09c72e12886471470a4eef6c8ce5752a6794ffd30680cfef64aef
MD5 06c0b76c7e83af28ac4df3864e18f6b7
BLAKE2b-256 dfd5bdbd02d63b605b84d6fbe2937b8c66b5d1c1fc2f122b644e3bb057091a16

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pymemtrace-0.4.1-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 e1feec766e0d6e9446ce066302660f8ec38bd9082b38f5f6852989a1661facf3
MD5 69008e87547aee1e5aaaea1d8271afc8
BLAKE2b-256 bd273dc0bbb39ebfe459071122855622592eeaf412cad33f95a950d6820deeda

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pymemtrace-0.4.1-cp39-cp39-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 5bba7d1b94fb3c9d6d14b5a38fc3c05bcc58658dd136971b8cfd7f897e6d9ef7
MD5 99e699647d3b71476132b291aea1e022
BLAKE2b-256 0d18947044d707e2ca1fd5ce34bf8a53349558cb9160e215c76589591e06336a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pymemtrace-0.4.1-cp38-cp38-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 cc90b8767e374904591d7c1fb516a4d8280851dbdfffb5b804c17dab3feaf169
MD5 5120cc7473977d771acaf6d6cea80c0a
BLAKE2b-256 dca74a4a29bfc3eaf99dbfd2d23272e85b4ac112bec855ea4e234a01f4f637c6

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