Skip to main content

A memory profiler for Python applications

Project description


OS Linux OS MacOS PyPI - Python Version PyPI - Implementation PyPI PyPI - Downloads Tests Code Style

Memray output

Memray is a memory profiler for Python. It can track memory allocations in Python code, in native extension modules, and in the Python interpreter itself. It can generate several different types of reports to help you analyze the captured memory usage data. While commonly used as a CLI tool, it can also be used as a library to perform more fine-grained profiling tasks.

Notable features:

  • 🕵️‍♀️ Traces every function call so it can accurately represent the call stack, unlike sampling profilers.
  • ℭ Also handles native calls in C/C++ libraries so the entire call stack is present in the results.
  • 🏎 Blazing fast! Profiling slows the application only slightly. Tracking native code is somewhat slower, but this can be enabled or disabled on demand.
  • 📈 It can generate various reports about the collected memory usage data, like flame graphs.
  • 🧵 Works with Python threads.
  • 👽🧵 Works with native-threads (e.g. C++ threads in C extensions).

Memray can help with the following problems:

  • Analyze allocations in applications to help discover the cause of high memory usage.
  • Find memory leaks.
  • Find hotspots in code that cause a lot of allocations.

Note Memray only works on Linux and MacOS, and cannot be installed on other platforms.

Installation

Memray requires Python 3.7+ and can be easily installed using most common Python packaging tools. We recommend installing the latest stable release from PyPI with pip:

    python3 -m pip install memray

Notice that Memray contains a C extension so releases are distributed as binary wheels as well as the source code. If a binary wheel is not available for your system (Linux x86/x64 or macOS), you'll need to ensure that all the dependencies are satisfied on the system where you are doing the installation.

Building from source

If you wish to build Memray from source you need the following binary dependencies in your system:

  • libunwind (for Linux)
  • liblz4

Check your package manager on how to install these dependencies (for example apt-get install libunwind-dev liblz4-dev in Debian-based systems or brew install lz4 in MacOS). Note that you may need to teach the compiler where to find the header and library files of the dependencies. For example, in MacOS with brew you may need to run:

export CFLAGS="-I$(brew --prefix lz4)/include" LDFLAGS="-L$(brew --prefix lz4)/lib -Wl,-rpath,$(brew --prefix lz4)/lib"

before installing memray. Check the documentation of your package manager to know the location of the header and library files for more detailed information.

Once you have the binary dependencies installed, you can clone the repository and follow with the normal building process:

git clone git@github.com:bloomberg/memray.git memray
cd memray
python3 -m venv ../memray-env/  # just an example, put this wherever you want
source ../memray-env/bin/activate
python3 -m pip install --upgrade pip
python3 -m pip install -e . -r requirements-test.txt -r requirements-extra.txt

This will install Memray in the virtual environment in development mode (the -e of the last pip install command).

Documentation

You can find the latest documentation available here.

Usage

There are many ways to use Memray. The easiest way is to use it as a command line tool to run your script, application, or library.

usage: memray [-h] [-v] {run,flamegraph,table,live,tree,parse,summary,stats} ...

Memory profiler for Python applications

Run `memray run` to generate a memory profile report, then use a reporter command
such as `memray flamegraph` or `memray table` to convert the results into HTML.

Example:

    $ python3 -m memray run -o output.bin my_script.py
    $ python3 -m memray flamegraph output.bin

positional arguments:
  {run,flamegraph,table,live,tree,parse,summary,stats}
                        Mode of operation
    run                 Run the specified application and track memory usage
    flamegraph          Generate an HTML flame graph for peak memory usage
    table               Generate an HTML table with all records in the peak memory usage
    live                Remotely monitor allocations in a text-based interface
    tree                Generate a tree view in the terminal for peak memory usage
    parse               Debug a results file by parsing and printing each record in it
    summary             Generate a terminal-based summary report of the functions that allocate most memory
    stats               Generate high level stats of the memory usage in the terminal

optional arguments:
  -h, --help            Show this help message and exit
  -v, --verbose         Increase verbosity. Option is additive and can be specified up to 3 times

Please submit feedback, ideas, and bug reports by filing a new issue at https://github.com/bloomberg/memray/issues

To use Memray over a script or a single python file you can use

python3 -m memray run my_script.py

If you normally run your application with python3 -m my_module, you can use the -m flag with memray run:

python3 -m memray run -m my_module

You can also invoke Memray as a command line tool without having to use -m to invoke it as a module:

memray run my_script.py
memray run -m my_module

The output will be a binary file (like memray-my_script.2369.bin) that you can analyze in different ways. One way is to use the memray flamegraph command to generate a flame graph:

memray flamegraph my_script.2369.bin

This will produce an HTML file with a flame graph of the memory usage that you can inspect with your favorite browser. There are multiple other reporters that you can use to generate other types of reports, some of them generating terminal-based output and some of them generating HTML files. Here is an example of a Memray flamegraph:

Pytest plugin

If you want an easy and convenient way to use memray in your test suite, you can consider using pytest-memray. Once installed, this pytest plugin allows you to simply add --memray to the command line invocation:

pytest --memray tests/

And will automatically get a report like this:

python3 -m pytest tests --memray
=============================================================================================================================== test session starts ================================================================================================================================
platform linux -- Python 3.8.10, pytest-6.2.4, py-1.10.0, pluggy-0.13.1
rootdir: /mypackage, configfile: pytest.ini
plugins: cov-2.12.0, memray-0.1.0
collected 21 items

tests/test_package.py .....................                                                                                                                                                                                                                      [100%]


================================================================================================================================= MEMRAY REPORT ==================================================================================================================================
Allocations results for tests/test_package.py::some_test_that_allocates

	 📦 Total memory allocated: 24.4MiB
	 📏 Total allocations: 33929
	 📊 Histogram of allocation sizes: |▂   █    |
	 🥇 Biggest allocating functions:
		- parse:/opt/bb/lib/python3.8/ast.py:47 -> 3.0MiB
		- parse:/opt/bb/lib/python3.8/ast.py:47 -> 2.3MiB
		- _visit:/opt/bb/lib/python3.8/site-packages/astroid/transforms.py:62 -> 576.0KiB
		- parse:/opt/bb/lib/python3.8/ast.py:47 -> 517.6KiB
		- __init__:/opt/bb/lib/python3.8/site-packages/astroid/node_classes.py:1353 -> 512.0KiB

You can also use some of the included markers to make tests fail if the execution of said test allocates more memory than allowed:

@pytest.mark.limit_memory("24 MB")
def test_foobar():
    # do some stuff that allocates memory

To learn more on how the plugin can be used and configured check out the plugin documentation.

Native mode

Memray supports tracking native C/C++ functions as well as Python functions. This can be especially useful when profiling applications that have C extensions (such as numpy or pandas) as this gives a holistic vision of how much memory is allocated by the extension and how much is allocated by Python itself.

To activate native tracking, you need to provide the --native argument when using the run subcommand:

memray run --native my_script.py

This will automatically add native information to the result file and it will be automatically used by any reporter (such the flamegraph or table reporters). This means that instead of seeing this in the flamegraphs:

You will now be able to see what's happening inside the Python calls:

Reporters display native frames in a different color than Python frames. They can also be distinguished by looking at the file location in a frame (Python frames will generally be generated from files with a .py extension while native frames will be generated from files with extensions like .c, .cpp or .h).

Live mode

Memray output

Memray's live mode runs a script or a module in a terminal-based interface that allows you to interactively inspect its memory usage while it runs. This is useful for debugging scripts or modules that take a long time to run or that exhibit multiple complex memory patterns. You can use the --live option to run the script or module in live mode:

    memray run --live my_script.py

or if you want to execute a module:

    memray run --live -m my_module

This will show the following TUI interface in your terminal:

Sorting results

The results are displayed in descending order of total memory allocated by a function and the subfunctions called by it. You can change the ordering with the following keyboard shortcuts:

  • t (default): Sort by total memory

  • o: Sort by own memory

  • a: Sort by allocation count

The sorted column is highlighted with < > characters around the title.

Viewing different threads

By default, the live command will present the main thread of the program. You can look at different threads of the program by pressing the left and right arrow keys.

API

In addition to tracking Python processes from a CLI using memray run, it is also possible to programmatically enable tracking within a running Python program.

import memray

with memray.Tracker("output_file.bin"):
    print("Allocations will be tracked until the with block ends")

For details, see the API documentation.

License

Memray is Apache-2.0 licensed, as found in the LICENSE file.

Code of Conduct

This project has adopted a Code of Conduct. If you have any concerns about the Code, or behavior that you have experienced in the project, please contact us at opensource@bloomberg.net.

Security Policy

If you believe you have identified a security vulnerability in this project, please send an email to the project team at opensource@bloomberg.net, detailing the suspected issue and any methods you've found to reproduce it.

Please do NOT open an issue in the GitHub repository, as we'd prefer to keep vulnerability reports private until we've had an opportunity to review and address them.

Contributing

We welcome your contributions to help us improve and extend this project!

Below you will find some basic steps required to be able to contribute to the project. If you have any questions about this process or any other aspect of contributing to a Bloomberg open source project, feel free to send an email to opensource@bloomberg.net and we'll get your questions answered as quickly as we can.

Contribution Licensing

Since this project is distributed under the terms of an open source license, contributions that you make are licensed under the same terms. In order for us to be able to accept your contributions, we will need explicit confirmation from you that you are able and willing to provide them under these terms, and the mechanism we use to do this is called a Developer's Certificate of Origin (DCO). This is very similar to the process used by the Linux(R) kernel, Samba, and many other major open source projects.

To participate under these terms, all that you must do is include a line like the following as the last line of the commit message for each commit in your contribution:

Signed-Off-By: Random J. Developer <random@developer.example.org>

The simplest way to accomplish this is to add -s or --signoff to your git commit command.

You must use your real name (sorry, no pseudonyms, and no anonymous contributions).

Steps

  • Create an Issue, select 'Feature Request', and explain the proposed change.
  • Follow the guidelines in the issue template presented to you.
  • Submit the Issue.
  • Submit a Pull Request and link it to the Issue by including "#" in the Pull Request summary.

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

memray-1.3.1.tar.gz (948.4 kB view details)

Uploaded Source

Built Distributions

memray-1.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.5 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

memray-1.3.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl (3.5 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ i686

memray-1.3.1-cp311-cp311-macosx_12_0_arm64.whl (536.8 kB view details)

Uploaded CPython 3.11 macOS 12.0+ ARM64

memray-1.3.1-cp311-cp311-macosx_10_14_x86_64.whl (583.7 kB view details)

Uploaded CPython 3.11 macOS 10.14+ x86-64

memray-1.3.1-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (2.7 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.12+ x86-64

memray-1.3.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl (2.8 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.12+ i686

memray-1.3.1-cp310-cp310-macosx_12_0_arm64.whl (540.9 kB view details)

Uploaded CPython 3.10 macOS 12.0+ ARM64

memray-1.3.1-cp310-cp310-macosx_10_14_x86_64.whl (588.2 kB view details)

Uploaded CPython 3.10 macOS 10.14+ x86-64

memray-1.3.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (2.7 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.12+ x86-64

memray-1.3.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl (2.8 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.12+ i686

memray-1.3.1-cp39-cp39-macosx_12_0_arm64.whl (541.7 kB view details)

Uploaded CPython 3.9 macOS 12.0+ ARM64

memray-1.3.1-cp39-cp39-macosx_10_14_x86_64.whl (589.3 kB view details)

Uploaded CPython 3.9 macOS 10.14+ x86-64

memray-1.3.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (2.8 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.12+ x86-64

memray-1.3.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl (2.8 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.12+ i686

memray-1.3.1-cp38-cp38-macosx_12_0_arm64.whl (556.3 kB view details)

Uploaded CPython 3.8 macOS 12.0+ ARM64

memray-1.3.1-cp38-cp38-macosx_10_14_x86_64.whl (601.8 kB view details)

Uploaded CPython 3.8 macOS 10.14+ x86-64

memray-1.3.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (2.8 MB view details)

Uploaded CPython 3.7m manylinux: glibc 2.12+ x86-64

memray-1.3.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl (2.8 MB view details)

Uploaded CPython 3.7m manylinux: glibc 2.12+ i686

File details

Details for the file memray-1.3.1.tar.gz.

File metadata

  • Download URL: memray-1.3.1.tar.gz
  • Upload date:
  • Size: 948.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.13

File hashes

Hashes for memray-1.3.1.tar.gz
Algorithm Hash digest
SHA256 23cdf6c6da0b6db47627e56bb9f618bd52ee635dca4ef3b791ffc9e473407da5
MD5 ee9e2d64573d7848c3f9ba6a5f001118
BLAKE2b-256 53f61b66893a496095a02a39276e741972f445f3d6afd704fb103ba2e4e7d9bc

See more details on using hashes here.

File details

Details for the file memray-1.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for memray-1.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4edf9bb01e7f9eb60f3e5fa5f96fc53d4e4c3d98e221795de2cc08264543d898
MD5 bd0ac9bbf6b50cb7de120cfb4a3b7cf5
BLAKE2b-256 b30faf2cf18b35b564f9a585c1006c14f606412153a0128248e082fd38453ad7

See more details on using hashes here.

File details

Details for the file memray-1.3.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for memray-1.3.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 37ceb32d836863e373477484cdc99e2be2fa2333e43a9905786c49e8f44ead4a
MD5 5c5ba62e51084174d8c4e5da75d25c75
BLAKE2b-256 0c62697f3c7e19da577b9ec2089af398e03a46daa7858380fb6cd82d4dac88ea

See more details on using hashes here.

File details

Details for the file memray-1.3.1-cp311-cp311-macosx_12_0_arm64.whl.

File metadata

File hashes

Hashes for memray-1.3.1-cp311-cp311-macosx_12_0_arm64.whl
Algorithm Hash digest
SHA256 20b6c919aaba9b37861727b55d210f4a4ea61962193851e7ab7cd77c74cf76dc
MD5 2cf43208c52bfcc992b6bd0edcec4b9e
BLAKE2b-256 f315079a2efe5da9721e196d8b37d69df1010faccdd7429797e5aca9577026f7

See more details on using hashes here.

File details

Details for the file memray-1.3.1-cp311-cp311-macosx_10_14_x86_64.whl.

File metadata

File hashes

Hashes for memray-1.3.1-cp311-cp311-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 f9a524a6259a7047ad463d6b132d679ac504d98b32cb98cc09563479c0e89329
MD5 62a2d0d383df30b1526018504582f25f
BLAKE2b-256 8324a85dcf4bd1c7d31e96e7cc95429010da50ff8ac870dfd1e94e79b0a70589

See more details on using hashes here.

File details

Details for the file memray-1.3.1-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for memray-1.3.1-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 041a5639e9e87fad3b62abd1c623b281f3ebbf3ee860eb9099c5f5da84410fd0
MD5 e956bbbb57e91643466dfd551f315fd8
BLAKE2b-256 fd0afd37ac6df82b55a251a737846f94313e057b54e9660a956aa33d20770407

See more details on using hashes here.

File details

Details for the file memray-1.3.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for memray-1.3.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 03618e5ec9cd0310a755b3f31c353eb9444df0cc8c9ab480c0358c46888836fe
MD5 c27feceaa9ebce89bc77c192bcf891cc
BLAKE2b-256 4f12214d453fdec3a0ef3d684d4a562f166addafa28e023f7e88ebae48425e5e

See more details on using hashes here.

File details

Details for the file memray-1.3.1-cp310-cp310-macosx_12_0_arm64.whl.

File metadata

File hashes

Hashes for memray-1.3.1-cp310-cp310-macosx_12_0_arm64.whl
Algorithm Hash digest
SHA256 03444ba1a0b774e02f2aa875e3534e04e347a7ce9be0d33cc19ca743930f5d65
MD5 fcc07dcd88e4a647ec19bf1460f8c945
BLAKE2b-256 63be76d7d242dbb5c9276c0781c05bf6ddb4b30057cd08eaf1fb0570ff938b62

See more details on using hashes here.

File details

Details for the file memray-1.3.1-cp310-cp310-macosx_10_14_x86_64.whl.

File metadata

File hashes

Hashes for memray-1.3.1-cp310-cp310-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 26344fc9244bf45a0f55e93cc0662ef243b3aec00d8fb0059e11dbe43c4c314d
MD5 2d64c5e73a0f5be0b5f2fd9f57e11b8c
BLAKE2b-256 a46182f237bbfa444699aebe1d84b4862fb933c4a08e2af46ea9bfd700207993

See more details on using hashes here.

File details

Details for the file memray-1.3.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for memray-1.3.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 47271aa3016c1d421741674ce6a40b7833fbdf3db925fc527e38a915e7f9c0ce
MD5 97f92975c762032320949a3f7fc98112
BLAKE2b-256 17d6bb6134760ab01076982dcbf5321ddcd2bf585a9a55533410332560f6e5b1

See more details on using hashes here.

File details

Details for the file memray-1.3.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for memray-1.3.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 9ce37915f21495ff7d6d4b3f56852a9b9a48adf37494aa57ba5da02519601d2f
MD5 97a594afee5dd5e57137b816ff2df6a7
BLAKE2b-256 2ac4db7d0135fd74463c397edbb206fc5d48b2b7bfe553ea3c1cc44d5cb014bb

See more details on using hashes here.

File details

Details for the file memray-1.3.1-cp39-cp39-macosx_12_0_arm64.whl.

File metadata

File hashes

Hashes for memray-1.3.1-cp39-cp39-macosx_12_0_arm64.whl
Algorithm Hash digest
SHA256 8cc349f59f56355588c6fa71c19db5dd894111303c65f4b3f6ab50e27b6347f9
MD5 23c625066e8ffb65647953090a2d09c6
BLAKE2b-256 64c1b6d6f04dc3635d0c03eb77de41ad7160d43de647047ab76fe225bb343091

See more details on using hashes here.

File details

Details for the file memray-1.3.1-cp39-cp39-macosx_10_14_x86_64.whl.

File metadata

File hashes

Hashes for memray-1.3.1-cp39-cp39-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 e55e5f4560690411467154f7b11125903f230c04b9bd07c8fba7b37c6a4968cc
MD5 802e0cf4ce469795893ff68725df9964
BLAKE2b-256 ee7ad9844afb89bf91bd9e448b8d91554d4314d0ab864395754b8afcf99cc365

See more details on using hashes here.

File details

Details for the file memray-1.3.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for memray-1.3.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 d2b8b3fad48de8a818a8e34f046a412a213fce94728fe6b7a1415fafcb9e1358
MD5 8044e3fa52bff2e935b94b7329a5ba8e
BLAKE2b-256 b0bf0388660dd8f1d30670ff5b01d87f4afbaf6485031b6f2ee62bfdfcd1341d

See more details on using hashes here.

File details

Details for the file memray-1.3.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for memray-1.3.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 e9db5cfa22563852b935902478779ad89d12f94f53753e97422df37470db167e
MD5 58ee3a3de433e555dcd19887f7a6720a
BLAKE2b-256 0facd45fd7d54cb7e76f2c4f135a4d6763b8cdd6f47d885bb61359377e67a9bb

See more details on using hashes here.

File details

Details for the file memray-1.3.1-cp38-cp38-macosx_12_0_arm64.whl.

File metadata

File hashes

Hashes for memray-1.3.1-cp38-cp38-macosx_12_0_arm64.whl
Algorithm Hash digest
SHA256 4568f063e4c8dc25bacd2f4c1e3057ee7f4b7d767367b776ed607a837450f502
MD5 d0f750af029f3b2ed6ff4b9e161ac74f
BLAKE2b-256 12fd458da68a534547a26e35570e10f84689fb3ac7ef66c568facef5593f0be1

See more details on using hashes here.

File details

Details for the file memray-1.3.1-cp38-cp38-macosx_10_14_x86_64.whl.

File metadata

File hashes

Hashes for memray-1.3.1-cp38-cp38-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 bff74e1012d07e55b67fa3471cd37fca3e03e39c220255d464f477b1ab5f8d9c
MD5 e7247582516ba0f43637a1ae986060bc
BLAKE2b-256 0db04afdada98273d0b5488674266ca91f3088b9366be51f16f3a433b2c917e0

See more details on using hashes here.

File details

Details for the file memray-1.3.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for memray-1.3.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 d837b9ddd2480d7095dac7f1f377b947f27ad312160240d866b005d944b79197
MD5 d355020a788c897224ba9c7f4ffaf32f
BLAKE2b-256 8235457f59b829636fed2cc5be56bfa5d13582570b63bef193e78f575248fa81

See more details on using hashes here.

File details

Details for the file memray-1.3.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for memray-1.3.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 d500f47391b873d759fe34eaccb3715b3acdcb45398b9cab3fa775be3e4c2206
MD5 6f1bb290114e7e553eb8fd5f1f53ada0
BLAKE2b-256 130791862a38c5f71084d0ad7e521c17d8013f23a9b5f610345b965b8ca3a05a

See more details on using hashes here.

Supported by

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