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.

tests 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.8.tar.gz (9.8 kB view details)

Uploaded Source

Built Distributions

cymem-2.0.8-cp312-cp312-win_amd64.whl (39.1 kB view details)

Uploaded CPython 3.12 Windows x86-64

cymem-2.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (46.7 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

cymem-2.0.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (44.2 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARM64

cymem-2.0.8-cp312-cp312-macosx_11_0_arm64.whl (41.4 kB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

cymem-2.0.8-cp312-cp312-macosx_10_9_x86_64.whl (42.3 kB view details)

Uploaded CPython 3.12 macOS 10.9+ x86-64

cymem-2.0.8-cp311-cp311-win_amd64.whl (39.1 kB view details)

Uploaded CPython 3.11 Windows x86-64

cymem-2.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (46.3 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

cymem-2.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (44.2 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

cymem-2.0.8-cp311-cp311-macosx_11_0_arm64.whl (41.2 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

cymem-2.0.8-cp311-cp311-macosx_10_9_x86_64.whl (41.9 kB view details)

Uploaded CPython 3.11 macOS 10.9+ x86-64

cymem-2.0.8-cp310-cp310-win_amd64.whl (39.0 kB view details)

Uploaded CPython 3.10 Windows x86-64

cymem-2.0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (46.1 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

cymem-2.0.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (44.0 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

cymem-2.0.8-cp310-cp310-macosx_11_0_arm64.whl (41.0 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

cymem-2.0.8-cp310-cp310-macosx_10_9_x86_64.whl (41.6 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

cymem-2.0.8-cp39-cp39-win_amd64.whl (39.5 kB view details)

Uploaded CPython 3.9 Windows x86-64

cymem-2.0.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (46.9 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

cymem-2.0.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (44.8 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

cymem-2.0.8-cp39-cp39-macosx_11_0_arm64.whl (41.6 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

cymem-2.0.8-cp39-cp39-macosx_10_9_x86_64.whl (42.1 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

cymem-2.0.8-cp38-cp38-win_amd64.whl (39.5 kB view details)

Uploaded CPython 3.8 Windows x86-64

cymem-2.0.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (46.4 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

cymem-2.0.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (44.4 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

cymem-2.0.8-cp38-cp38-macosx_11_0_arm64.whl (41.9 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

cymem-2.0.8-cp38-cp38-macosx_10_9_x86_64.whl (42.5 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

cymem-2.0.8-cp37-cp37m-win_amd64.whl (39.8 kB view details)

Uploaded CPython 3.7m Windows x86-64

cymem-2.0.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (46.7 kB view details)

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

cymem-2.0.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (45.0 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ ARM64

cymem-2.0.8-cp37-cp37m-macosx_10_9_x86_64.whl (42.3 kB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

cymem-2.0.8-cp36-cp36m-win_amd64.whl (46.5 kB view details)

Uploaded CPython 3.6m Windows x86-64

cymem-2.0.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (44.7 kB view details)

Uploaded CPython 3.6m manylinux: glibc 2.17+ x86-64

cymem-2.0.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (43.2 kB view details)

Uploaded CPython 3.6m manylinux: glibc 2.17+ ARM64

File details

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

File metadata

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

File hashes

Hashes for cymem-2.0.8.tar.gz
Algorithm Hash digest
SHA256 8fb09d222e21dcf1c7e907dc85cf74501d4cea6c4ed4ac6c9e016f98fb59cbbf
MD5 1cc1952c8af3a3a85b6b8054b74af7c5
BLAKE2b-256 3632f4a457fc6c160a9e72b15dab1ca14ca5c8869074638bca8bfc26120c04e9

See more details on using hashes here.

File details

Details for the file cymem-2.0.8-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: cymem-2.0.8-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 39.1 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.7.9

File hashes

Hashes for cymem-2.0.8-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 ecd12e3bacf3eed5486e4cd8ede3c12da66ee0e0a9d0ae046962bc2bb503acef
MD5 9d0d55bd9acc2b0a4dc494ba2a638b77
BLAKE2b-256 35e034b11adc80502f0760ce2892dfdfcd8a7f450acd3147156c98620cb4071d

See more details on using hashes here.

File details

Details for the file cymem-2.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cymem-2.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7bf49e3ea2c441f7b7848d5c61b50803e8cbd49541a70bb41ad22fce76d87603
MD5 59033bc48ba57647a962ef41671bf1a3
BLAKE2b-256 3b591cc0df0f8a5fb90412cfc7eb084ceeb079f4349232c422e10e502eb255c3

See more details on using hashes here.

File details

Details for the file cymem-2.0.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for cymem-2.0.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 a2cc38930ff5409f8d61f69a01e39ecb185c175785a1c9bec13bcd3ac8a614ba
MD5 bb4ba147a0774f9acccbfa907ac3a45d
BLAKE2b-256 8a7770f8b77c4db30e5765092033e283aadd51ad78364f10cd2d331a1f158fcb

See more details on using hashes here.

File details

Details for the file cymem-2.0.8-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cymem-2.0.8-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9235957f8c6bc2574a6a506a1687164ad629d0b4451ded89d49ebfc61b52660c
MD5 36842ca917e199162159d25c303e0bc1
BLAKE2b-256 14f4fb926be8f0d826f35eb86e021a1cbdc67966fa0f2ce94cd24ad898260b9c

See more details on using hashes here.

File details

Details for the file cymem-2.0.8-cp312-cp312-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for cymem-2.0.8-cp312-cp312-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 cb51fddf1b920abb1f2742d1d385469bc7b4b8083e1cfa60255e19bc0900ccb5
MD5 210ecdd8b9743c2970745c64ffc2adf9
BLAKE2b-256 a3f8030ee2fc2665f7d2e62079299e593a79a661b8a32f69653fee6cc0cd2f30

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for cymem-2.0.8-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 ab3cf20e0eabee9b6025ceb0245dadd534a96710d43fb7a91a35e0b9e672ee44
MD5 f7712046aba837b405398641c38b0d45
BLAKE2b-256 c1c3dd044e6f62a3d317c461f6f0c153c6573ed13025752d779e514000c15dd2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cymem-2.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 42c993589d1811ec665d37437d5677b8757f53afadd927bf8516ac8ce2d3a50c
MD5 bcb6dd11cba74aab3e6e6ffa34b2f166
BLAKE2b-256 e5bc761acaf88b1fa69a6b75b55c24fbd8b47dab1a3c414d9512e907a646a048

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cymem-2.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 4ac218cf8a43a761dc6b2f14ae8d183aca2bbb85b60fe316fd6613693b2a7914
MD5 2e1c0ce4ca98d2ef4c1150deda79ba4c
BLAKE2b-256 bb3b3d6b284c82be7571c0a67b11edce486f404971b4ec849fac4a679f85f93a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cymem-2.0.8-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0d5f83dc3cb5a39f0e32653cceb7c8ce0183d82f1162ca418356f4a8ed9e203e
MD5 871b5b8f53a3ab64ff198a18c120832c
BLAKE2b-256 d7f667babf1439cdd6d46e4e805616bee84981305c80e562320c293712f54034

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cymem-2.0.8-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 6b84b780d52cb2db53d4494fe0083c4c5ee1f7b5380ceaea5b824569009ee5bd
MD5 2a67cf98d592319204e4f58f0e41038d
BLAKE2b-256 201f2ae07056430a0276e0cbd765652db82ea153c5fb2a3d753fbffd553827d5

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for cymem-2.0.8-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 a63a2bef4c7e0aec7c9908bca0a503bf91ac7ec18d41dd50dc7dff5d994e4387
MD5 f286418216b7e685516a48fe2aafb9df
BLAKE2b-256 51124aa9eec680c6d12b2275d479e159c3d063d7c757175063dd45386e15b39d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cymem-2.0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e8260445652ae5ab19fff6851f32969a7b774f309162e83367dd0f69aac5dbf7
MD5 c66b229b680238bcd06f671f59585294
BLAKE2b-256 e9133bed1a1d1cce7937eb797d760c0cca973dbdc1891ad7e2f066ae418fd697

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cymem-2.0.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 29a551eda23eebd6d076b855f77a5ed14a1d1cae5946f7b3cb5de502e21b39b0
MD5 5b09218013c22d6fefa2de9552bd7e0b
BLAKE2b-256 42f0a5cfe24f98b9fa1c6552e7d6f3e67db3a2bd9d68cc3946651cd53513f588

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cymem-2.0.8-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bd33da892fb560ba85ea14b1528c381ff474048e861accc3366c8b491035a378
MD5 81c34a0920aacc716186f34811b08049
BLAKE2b-256 83bb21dcb7cb06c97fd99019369071f0b9ad544c3db68343abbceb283e8a5223

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cymem-2.0.8-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 77b5d3a73c41a394efd5913ab7e48512054cd2dabb9582d489535456641c7666
MD5 6993a3b361cafd2c2d80455f99d7f6e7
BLAKE2b-256 06e80ab9faadd0911307c4158cc52abcaae6141283abb17275326b4d3b99089f

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for cymem-2.0.8-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 ceeab3ce2a92c7f3b2d90854efb32cb203e78cb24c836a5a9a2cac221930303b
MD5 278fb1f3baa42c6efdcca20e1e1d68d8
BLAKE2b-256 09881781e6374d9aa014224c3732f8c4ab473c63ed0945c9050d980486d96401

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cymem-2.0.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e4e57bee56d35b90fc2cba93e75b2ce76feaca05251936e28a96cf812a1f5dda
MD5 ce9b44a16d9a6fe24e4b995677248a11
BLAKE2b-256 2b9e18c6e7ac58ac84a02d3db0f43771515cdc4621b2e8e7062939dd6adef0df

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cymem-2.0.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 7372e2820fa66fd47d3b135f3eb574ab015f90780c3a21cfd4809b54f23a4723
MD5 14e9ee5ba2556637e683e68470e2e2a8
BLAKE2b-256 be04d37d326234dcf51596613973c6fe7da6a309e49fe08578f266b8e84d641e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cymem-2.0.8-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a4f8f2bfee34f6f38b206997727d29976666c89843c071a968add7d61a1e8024
MD5 acff68e4d3f5f61402afc30b16119cdb
BLAKE2b-256 0fe779e579f629588ace669d3c06b987189b6013ee554723b9aca71975d15088

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cymem-2.0.8-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 b896c83c08dadafe8102a521f83b7369a9c5cc3e7768eca35875764f56703f4c
MD5 0fa17238544ed92dbc750c244d69bc64
BLAKE2b-256 0269ae03a9b809b1fda0f66d7f17ac0042fb5f7c70950884dffc986b112267ef

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for cymem-2.0.8-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 6a6edddb30dd000a27987fcbc6f3c23b7fe1d74f539656952cb086288c0e4e29
MD5 a528f80e2e148663a753ffa11107136b
BLAKE2b-256 805d3796ece18f7dc227f7197f595c88bb45025807e61205632b3e35062199c0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cymem-2.0.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 84f8c58cde71b8fc7024883031a4eec66c0a9a4d36b7850c3065493652695156
MD5 da7dfa7bfb9141dd48e15ccfb48dfd68
BLAKE2b-256 5f70b9945a7918d467c6c7112f6e20176d4f41b89d7ba0b590015b4cb62fb23d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cymem-2.0.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 8e370dd54359101b125bfb191aca0542718077b4edb90ccccba1a28116640fed
MD5 119ef564be459ed680cfe12aaa832cf4
BLAKE2b-256 50e0c118049bb79a024b17a9791f17d60fa50782414c1f55ea388cfee3c8ac5c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cymem-2.0.8-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d513f0d5c6d76facdc605e42aa42c8d50bb7dedca3144ec2b47526381764deb0
MD5 2983d77fa97a075c2192b8df70721cf6
BLAKE2b-256 c390536f88369ae2904021e7b32ec0e2b73aab1942ceb2c4916d707605b969b4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cymem-2.0.8-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 1e593cd57e2e19eb50c7ddaf7e230b73c890227834425b9dadcd4a86834ef2ab
MD5 2e595cdc19cec0c33d30b135feef5a50
BLAKE2b-256 56e0d3b5727fd7650bc9617edd8dd982405adb44a012e19890972608ff53afa0

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for cymem-2.0.8-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 ada6eb022e4a0f4f11e6356a5d804ceaa917174e6cf33c0b3e371dbea4dd2601
MD5 9922f0bec518010019d9f3d6ec7daae3
BLAKE2b-256 8373f47bd6ea9e5722967fc8e6e73eb64037dd2a8aff256283f2331c0b76014c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cymem-2.0.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e6b83a5972a64f62796118da79dfeed71f4e1e770b2b7455e889c909504c2358
MD5 1a4500900b857c2327bd921968e43556
BLAKE2b-256 1591ff540730f341dee2ad7fade35e13ce0f9ad4d4e5b20855a074b9a0c5126e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cymem-2.0.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 6ce641f7ba0489bd1b42a4335a36f38c8507daffc29a512681afaba94a0257d2
MD5 ba8400a23d2ba30cd68f808943ad4e6a
BLAKE2b-256 2da9370c3ace4d318ed556490c5f91e6e896007e78fe7ac37086d50777a56223

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cymem-2.0.8-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 b9c05db55ea338648f8e5f51dd596568c7f62c5ae32bf3fa5b1460117910ebae
MD5 bb9922a327041f8e28375a7248b1331a
BLAKE2b-256 2a00e900492172c167e06ecd3a0aabf9dc740d6d5620a535fa2df3a6c75fa1e5

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for cymem-2.0.8-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 6204f0a3307bf45d109bf698ba37997ce765f21e359284328e4306c7500fcde8
MD5 1bb4d60fbc5f72eefb3d37e5023a3c14
BLAKE2b-256 5079feac904b9363b7e23ae73e91eb4e02db484a0ad7127a90ed9f116e4ee92f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cymem-2.0.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 17cd2c2791c8f6b52f269a756ba7463f75bf7265785388a2592623b84bb02bf8
MD5 519f87da9e87c47612aa522638740197
BLAKE2b-256 2c01e86cfbb8606c23d67fab01ed668ef11b34cb53611192eb73235cb7868d8b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cymem-2.0.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 167d8019db3b40308aabf8183fd3fbbc256323b645e0cbf2035301058c439cd0
MD5 8836bebe5b91b66210b13359d8453223
BLAKE2b-256 3a5dad5ebb3ac2a5d885ddf4e908a3dafe218295e6428d2dce1789eb061dc9df

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