Skip to main content

Manage calls to calloc/free through Cython

Project description

cymem: A Cython Memory Helper

cymem provides two small memory-management helpers for Cython. They make it easy to tie memory to a Python object's life-cycle, so that the memory is freed when the object is garbage collected.

Azure Pipelines pypi Version conda Version Python wheels

Overview

The most useful is cymem.Pool, which acts as a thin wrapper around the calloc function:

from cymem.cymem cimport Pool
cdef Pool mem = Pool()
data1 = <int*>mem.alloc(10, sizeof(int))
data2 = <float*>mem.alloc(12, sizeof(float))

The Pool object saves the memory addresses internally, and frees them when the object is garbage collected. Typically you'll attach the Pool to some cdef'd class. This is particularly handy for deeply nested structs, which have complicated initialization functions. Just pass the Pool object into the initializer, and you don't have to worry about freeing your struct at all — all of the calls to Pool.alloc will be automatically freed when the Pool expires.

Installation

Installation is via pip, and requires Cython. Before installing, make sure that your pip, setuptools and wheel are up to date.

pip install -U pip setuptools wheel
pip install cymem

Example Use Case: An array of structs

Let's say we want a sequence of sparse matrices. We need fast access, and a Python list isn't performing well enough. So, we want a C-array or C++ vector, which means we need the sparse matrix to be a C-level struct — it can't be a Python class. We can write this easily enough in Cython:

"""Example without Cymem

To use an array of structs, we must carefully walk the data structure when
we deallocate it.
"""

from libc.stdlib cimport calloc, free

cdef struct SparseRow:
    size_t length
    size_t* indices
    double* values

cdef struct SparseMatrix:
    size_t length
    SparseRow* rows

cdef class MatrixArray:
    cdef size_t length
    cdef SparseMatrix** matrices

    def __cinit__(self, list py_matrices):
        self.length = 0
        self.matrices = NULL

    def __init__(self, list py_matrices):
        self.length = len(py_matrices)
        self.matrices = <SparseMatrix**>calloc(len(py_matrices), sizeof(SparseMatrix*))

        for i, py_matrix in enumerate(py_matrices):
            self.matrices[i] = sparse_matrix_init(py_matrix)

    def __dealloc__(self):
        for i in range(self.length):
            sparse_matrix_free(self.matrices[i])
        free(self.matrices)


cdef SparseMatrix* sparse_matrix_init(list py_matrix) except NULL:
    sm = <SparseMatrix*>calloc(1, sizeof(SparseMatrix))
    sm.length = len(py_matrix)
    sm.rows = <SparseRow*>calloc(sm.length, sizeof(SparseRow))
    cdef size_t i, j
    cdef dict py_row
    cdef size_t idx
    cdef double value
    for i, py_row in enumerate(py_matrix):
        sm.rows[i].length = len(py_row)
        sm.rows[i].indices = <size_t*>calloc(sm.rows[i].length, sizeof(size_t))
        sm.rows[i].values = <double*>calloc(sm.rows[i].length, sizeof(double))
        for j, (idx, value) in enumerate(py_row.items()):
            sm.rows[i].indices[j] = idx
            sm.rows[i].values[j] = value
    return sm


cdef void* sparse_matrix_free(SparseMatrix* sm) except *:
    cdef size_t i
    for i in range(sm.length):
        free(sm.rows[i].indices)
        free(sm.rows[i].values)
    free(sm.rows)
    free(sm)

We wrap the data structure in a Python ref-counted class at as low a level as we can, given our performance constraints. This allows us to allocate and free the memory in the __cinit__ and __dealloc__ Cython special methods.

However, it's very easy to make mistakes when writing the __dealloc__ and sparse_matrix_free functions, leading to memory leaks. cymem prevents you from writing these deallocators at all. Instead, you write as follows:

"""Example with Cymem.

Memory allocation is hidden behind the Pool class, which remembers the
addresses it gives out.  When the Pool object is garbage collected, all of
its addresses are freed.

We don't need to write MatrixArray.__dealloc__ or sparse_matrix_free,
eliminating a common class of bugs.
"""
from cymem.cymem cimport Pool

cdef struct SparseRow:
    size_t length
    size_t* indices
    double* values

cdef struct SparseMatrix:
    size_t length
    SparseRow* rows


cdef class MatrixArray:
    cdef size_t length
    cdef SparseMatrix** matrices
    cdef Pool mem

    def __cinit__(self, list py_matrices):
        self.mem = None
        self.length = 0
        self.matrices = NULL

    def __init__(self, list py_matrices):
        self.mem = Pool()
        self.length = len(py_matrices)
        self.matrices = <SparseMatrix**>self.mem.alloc(self.length, sizeof(SparseMatrix*))
        for i, py_matrix in enumerate(py_matrices):
            self.matrices[i] = sparse_matrix_init(self.mem, py_matrix)

cdef SparseMatrix* sparse_matrix_init_cymem(Pool mem, list py_matrix) except NULL:
    sm = <SparseMatrix*>mem.alloc(1, sizeof(SparseMatrix))
    sm.length = len(py_matrix)
    sm.rows = <SparseRow*>mem.alloc(sm.length, sizeof(SparseRow))
    cdef size_t i, j
    cdef dict py_row
    cdef size_t idx
    cdef double value
    for i, py_row in enumerate(py_matrix):
        sm.rows[i].length = len(py_row)
        sm.rows[i].indices = <size_t*>mem.alloc(sm.rows[i].length, sizeof(size_t))
        sm.rows[i].values = <double*>mem.alloc(sm.rows[i].length, sizeof(double))
        for j, (idx, value) in enumerate(py_row.items()):
            sm.rows[i].indices[j] = idx
            sm.rows[i].values[j] = value
    return sm

All that the Pool class does is remember the addresses it gives out. When the MatrixArray object is garbage-collected, the Pool object will also be garbage collected, which triggers a call to Pool.__dealloc__. The Pool then frees all of its addresses. This saves you from walking back over your nested data structures to free them, eliminating a common class of errors.

Custom Allocators

Sometimes external C libraries use private functions to allocate and free objects, but we'd still like the laziness of the Pool.

from cymem.cymem cimport Pool, WrapMalloc, WrapFree
cdef Pool mem = Pool(WrapMalloc(priv_malloc), WrapFree(priv_free))

Download files

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

Source Distribution

cymem-2.0.7.tar.gz (9.9 kB view details)

Uploaded Source

Built Distributions

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

cymem-2.0.7-cp311-cp311-win_amd64.whl (28.4 kB view details)

Uploaded CPython 3.11Windows x86-64

cymem-2.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (34.4 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

cymem-2.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (32.7 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

cymem-2.0.7-cp311-cp311-macosx_11_0_arm64.whl (30.1 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

cymem-2.0.7-cp311-cp311-macosx_10_9_x86_64.whl (31.4 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

cymem-2.0.7-cp310-cp310-win_amd64.whl (29.5 kB view details)

Uploaded CPython 3.10Windows x86-64

cymem-2.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (34.8 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

cymem-2.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (33.1 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

cymem-2.0.7-cp310-cp310-macosx_11_0_arm64.whl (30.8 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

cymem-2.0.7-cp310-cp310-macosx_10_9_x86_64.whl (32.2 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

cymem-2.0.7-cp39-cp39-win_amd64.whl (30.2 kB view details)

Uploaded CPython 3.9Windows x86-64

cymem-2.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (35.5 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

cymem-2.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (33.8 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ ARM64

cymem-2.0.7-cp39-cp39-macosx_11_0_arm64.whl (31.5 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

cymem-2.0.7-cp39-cp39-macosx_10_9_x86_64.whl (33.0 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

cymem-2.0.7-cp38-cp38-win_amd64.whl (30.2 kB view details)

Uploaded CPython 3.8Windows x86-64

cymem-2.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (36.4 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

cymem-2.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (34.5 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ ARM64

cymem-2.0.7-cp38-cp38-macosx_11_0_arm64.whl (31.0 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

cymem-2.0.7-cp38-cp38-macosx_10_9_x86_64.whl (32.5 kB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

cymem-2.0.7-cp37-cp37m-win_amd64.whl (30.0 kB view details)

Uploaded CPython 3.7mWindows x86-64

cymem-2.0.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (36.0 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ x86-64

cymem-2.0.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (34.2 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ ARM64

cymem-2.0.7-cp37-cp37m-macosx_10_9_x86_64.whl (32.3 kB view details)

Uploaded CPython 3.7mmacOS 10.9+ x86-64

cymem-2.0.7-cp36-cp36m-win_amd64.whl (36.2 kB view details)

Uploaded CPython 3.6mWindows x86-64

cymem-2.0.7-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (35.7 kB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.17+ x86-64

cymem-2.0.7-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (34.1 kB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.17+ ARM64

File details

Details for the file cymem-2.0.7.tar.gz.

File metadata

  • Download URL: cymem-2.0.7.tar.gz
  • Upload date:
  • Size: 9.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.7.9

File hashes

Hashes for cymem-2.0.7.tar.gz
Algorithm Hash digest
SHA256 e6034badb5dd4e10344211c81f16505a55553a7164adc314c75bd80cf07e57a8
MD5 f9f8b455bb055061e7e0133676556136
BLAKE2b-256 b0d350c90dd821e44ad289653f0029d1690fca82f90df293e77e21443f5ea4fc

See more details on using hashes here.

File details

Details for the file cymem-2.0.7-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: cymem-2.0.7-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 28.4 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.7.9

File hashes

Hashes for cymem-2.0.7-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 10178e402bb512b2686b8c2f41f930111e597237ca8f85cb583ea93822ef798d
MD5 eab8eac9d387467da66d71da82ffd596
BLAKE2b-256 6e9e2f18aa8f03c6d7692a2f6c884f4bc8f0ab0ba065786f2a4ba966d3e19ef6

See more details on using hashes here.

File details

Details for the file cymem-2.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cymem-2.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2aa33f1dbd7ceda37970e174c38fd1cf106817a261aa58521ba9918156868231
MD5 6a68f4cdd3cced03cdf6808360190993
BLAKE2b-256 861ec6f9060c59da4428d819f5917a870dea408da9e6723b190e0da447b9721a

See more details on using hashes here.

File details

Details for the file cymem-2.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for cymem-2.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 9e5e1b7de7952d89508d07601b9e95b2244e70d7ef60fbc161b3ad68f22815f8
MD5 eda4f6881338eccddb49b3f73d65c7fd
BLAKE2b-256 09a6c120371eb2370744cc80b07d9cf8fd2f1b69d4cf71ad920f0e238dbd36ca

See more details on using hashes here.

File details

Details for the file cymem-2.0.7-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cymem-2.0.7-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 df543a36e7000808fe0a03d92fd6cd8bf23fa8737c3f7ae791a5386de797bf79
MD5 1146b8a761f31053bf4c057b73fe328f
BLAKE2b-256 042766b11887a2542fd03c3632209860ddee5fafee58efc508832a269dfb6959

See more details on using hashes here.

File details

Details for the file cymem-2.0.7-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for cymem-2.0.7-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 314273be1f143da674388e0a125d409e2721fbf669c380ae27c5cbae4011e26d
MD5 dfcd3c1b20cc986ca9b17a568b493586
BLAKE2b-256 d509819e5a536f898c8f464da28a74b13b0b56683e307949c62a319a57afb162

See more details on using hashes here.

File details

Details for the file cymem-2.0.7-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: cymem-2.0.7-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 29.5 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.7.9

File hashes

Hashes for cymem-2.0.7-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 864701e626b65eb2256060564ed8eb034ebb0a8f14ce3fbef337e88352cdee9f
MD5 bc4664cd17699f10b2c4860c83f90c25
BLAKE2b-256 5d47bd5df7891ce656be8ff14ca9993168f391b389545b76b268f9cee8958412

See more details on using hashes here.

File details

Details for the file cymem-2.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cymem-2.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d18250f97eeb13af2e8b19d3cefe4bf743b963d93320b0a2e729771410fd8cf4
MD5 0a68e57cc5c4d356460c7e6ada94f49b
BLAKE2b-256 cabe1f6ac43fea9f7c353acf7db81bd01f651887882ce27e8018759949374cef

See more details on using hashes here.

File details

Details for the file cymem-2.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for cymem-2.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c183257dc5ab237b664f64156c743e788f562417c74ea58c5a3939fe2d48d6f6
MD5 097a3daf48007c9acbcea92cb35892e3
BLAKE2b-256 901e95094bace76d7c62e08f4e189f0e8d558ac44a78c3efa820db530bf4f37e

See more details on using hashes here.

File details

Details for the file cymem-2.0.7-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cymem-2.0.7-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 42aedfd2e77aa0518a24a2a60a2147308903abc8b13c84504af58539c39e52a3
MD5 7e4f462b72a40a537407b044493d83ee
BLAKE2b-256 22d83a0c220ff497ad7ca3c77d3d6d2825ace2a2ba0e1be1c50b5fcd567577bd

See more details on using hashes here.

File details

Details for the file cymem-2.0.7-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for cymem-2.0.7-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4981fc9182cc1fe54bfedf5f73bfec3ce0c27582d9be71e130c46e35958beef0
MD5 9682d7434f40ef54cbf747f37c807807
BLAKE2b-256 45d1fcd546003ffbeb15916a15d38263ec2d452248f32a5a876462e39fd326ef

See more details on using hashes here.

File details

Details for the file cymem-2.0.7-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: cymem-2.0.7-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 30.2 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.7.9

File hashes

Hashes for cymem-2.0.7-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 59a09cf0e71b1b88bfa0de544b801585d81d06ea123c1725e7c5da05b7ca0d20
MD5 431f64015839b43c550c73308481d60a
BLAKE2b-256 d82d61953a623544f0b87d931e5393dbe7ca0ea727e87c72ab95db715c8abecb

See more details on using hashes here.

File details

Details for the file cymem-2.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cymem-2.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f165d7bce55d6730930e29d8294569788aa127f1be8d1642d9550ed96223cb37
MD5 e6a27c69ca30563db65166fc1237d2f6
BLAKE2b-256 b162c615d7ff20647b1c568eac00a94df1e88e7c379646659eb0be6e346cadfe

See more details on using hashes here.

File details

Details for the file cymem-2.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for cymem-2.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 4f359cab9f16e25b3098f816c40acbf1697a3b614a8d02c56e6ebcb9c89a06b3
MD5 fc8577c2e4453acb08bb3ef74507e261
BLAKE2b-256 f1be8af4c91f3cd7453284733ca66ce2e3ed97f4602adf170b6e3d9b21a89dd3

See more details on using hashes here.

File details

Details for the file cymem-2.0.7-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cymem-2.0.7-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3da89464021fe669932fce1578343fcaf701e47e3206f50d320f4f21e6683ca5
MD5 1a790d86cbaa1286e6a3a898a0e94747
BLAKE2b-256 22d361033b089e59bf7827f3db72da2fb003ec3989ba3543bf149e2aa45f11dd

See more details on using hashes here.

File details

Details for the file cymem-2.0.7-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for cymem-2.0.7-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 e156788d32ad8f7141330913c5d5d2aa67182fca8f15ae22645e9f379abe8a4c
MD5 714eff98f7e1e40d6575aebaa8b8ef51
BLAKE2b-256 b2f1767458d63d2162ce8492f462ad5f92125d3d43eabc3a03bf043e57c3512f

See more details on using hashes here.

File details

Details for the file cymem-2.0.7-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: cymem-2.0.7-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 30.2 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.7.9

File hashes

Hashes for cymem-2.0.7-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 48b98da6b906fe976865263e27734ebc64f972a978a999d447ad6c83334e3f90
MD5 f970a9e78b709c2273e0bd9a27dcc7ba
BLAKE2b-256 9699a5f558006387913f1a1b4af5ccae610b19ebe5498e7199c2da10e77429c8

See more details on using hashes here.

File details

Details for the file cymem-2.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cymem-2.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a9525ad563b36dc1e30889d0087a0daa67dd7bb7d3e1530c4b61cd65cc756a5b
MD5 0e0964a0e93b4b7f3d5523c45b801e79
BLAKE2b-256 012f9d841b40404978d93d0e6c091614c9df63d91483a3b2f1d0472c22285e67

See more details on using hashes here.

File details

Details for the file cymem-2.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for cymem-2.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 6c50794c612801ed8b599cd4af1ed810a0d39011711c8224f93e1153c00e08d1
MD5 0b083421e676c44fafe0a001578cba01
BLAKE2b-256 1cf0daffeefab3645305057ea97b3d4bfe478c28719a4e6b14cbe6095c0de417

See more details on using hashes here.

File details

Details for the file cymem-2.0.7-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cymem-2.0.7-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 24b779046484674c054af1e779c68cb224dc9694200ac13b22129d7fb7e99e6d
MD5 93b51634e6c928d2ae9b343d87ca370d
BLAKE2b-256 78e13f840e321e25b60ce88c138282d0d204b3c2a1fcc07e0e5940ff7c662f70

See more details on using hashes here.

File details

Details for the file cymem-2.0.7-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for cymem-2.0.7-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4302df5793a320c4f4a263c7785d2fa7f29928d72cb83ebeb34d64a610f8d819
MD5 54114ec2a32d2fbeb95dea608f5c4298
BLAKE2b-256 f70434905a11acdf77f9788790871a2f8b19d2adc7a6f6f4df16f74b601e2866

See more details on using hashes here.

File details

Details for the file cymem-2.0.7-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: cymem-2.0.7-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 30.0 kB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.7.9

File hashes

Hashes for cymem-2.0.7-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 5ea6b027fdad0c3e9a4f1b94d28d213be08c466a60c72c633eb9db76cf30e53a
MD5 583ab99af9698618d49d05443d92b7e4
BLAKE2b-256 03e1df8296e47d81e1f9055b9ceba0dc4e89d900380674abeff6d94e069ce4f2

See more details on using hashes here.

File details

Details for the file cymem-2.0.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cymem-2.0.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6f9e63e5ad4ed6ffa21fd8db1c03b05be3fea2f32e32fdace67a840ea2702c3d
MD5 594ea6bd95a7e83ae8f38b3cae85a24a
BLAKE2b-256 8adfdd3cb90cb45fafa41a9b8ace5dfef553d50567a9abfd75eef21efb9fc3e1

See more details on using hashes here.

File details

Details for the file cymem-2.0.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for cymem-2.0.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 011039e12d3144ac1bf3a6b38f5722b817f0d6487c8184e88c891b360b69f533
MD5 9916f5148d0262809f1e3bcaeed6441a
BLAKE2b-256 cdfbcd73656ffb41a05452ec90bd7a201f1e065310c013efa20269cb80c2531f

See more details on using hashes here.

File details

Details for the file cymem-2.0.7-cp37-cp37m-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for cymem-2.0.7-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 26e5d5c6958855d2fe3d5629afe85a6aae5531abaa76f4bc21b9abf9caaccdfe
MD5 beabef4e6263aa6c0c7860de297b23f2
BLAKE2b-256 cb6a3cb5e33ad0adc201eadbdff70be4d54fdc2772947252fc157dc9a041bf16

See more details on using hashes here.

File details

Details for the file cymem-2.0.7-cp36-cp36m-win_amd64.whl.

File metadata

  • Download URL: cymem-2.0.7-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 36.2 kB
  • Tags: CPython 3.6m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.7.9

File hashes

Hashes for cymem-2.0.7-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 0ac45088abffbae9b7db2c597f098de51b7e3c1023cb314e55c0f7f08440cf66
MD5 ecab7bc86702d8a8e8ea51a57fe5893f
BLAKE2b-256 2e919854d0fedbd42db157c9a88269dbfe556faed06666d9b44f6296da85a77f

See more details on using hashes here.

File details

Details for the file cymem-2.0.7-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cymem-2.0.7-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 85359ab7b490e6c897c04863704481600bd45188a0e2ca7375eb5db193e13cb7
MD5 a610b563d4857a830b6bb5f951ad2524
BLAKE2b-256 22ca6fe64ed47a76af1ecf59c437b6cc135072a06a3cef2ce62f8d8f38ce3cae

See more details on using hashes here.

File details

Details for the file cymem-2.0.7-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for cymem-2.0.7-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 a2971b7da5aa2e65d8fbbe9f2acfc19ff8e73f1896e3d6e1223cc9bf275a0207
MD5 658349d60806741319fe4375f9512f85
BLAKE2b-256 00bd0369d6325ef95eb71d251720e0f7551727a270b41bacc09db5323b87343c

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