Skip to main content

A Vectorized Dictionary for Python

Project description

phashmap - A Vectorized Python Dict/Set

phashmap is a copy of GetPy(https://github.com/atom-moyer/getpy), to provide the highest performance python dict/set that integrates into the python scientific ecosystem for Linux and Windows.

Installation

pip install phashmap

Linux and Windows build is currently distributed. If you would like to build the package from source you can clone the repo and run python setup.py install. Compilation will require 16gb of ram. I am working on getting that down.

About

GetPy is a thin binding to the Parallel Hashmap (https://github.com/greg7mdp/parallel-hashmap.git) which is the current state of the art unordered map/set with minimal memory overhead and fast runtime speed. The binding layer is supported by PyBind11 (https://github.com/pybind/pybind11.git) which is fast to compile and simple to extend.

How To Use

The gp.Dict and gp.Set objects are designed to maintain a similar interface to the corresponding standard python objects. There are some key differences though, which are necessary for vectorization and other performance considerations.

  1. gp.Dict.__init__ has three arguments key_type, value_type, and default_value. The type arguments are define which compiled data structure will be used under the hood, and the full list of preset combinations of np.dtypes is found with gp.dict_types. You can also specify a default_value at construction which must be castable to the value_type. This is the value returned by the dictionary if a key is not found.

  2. All of getpy.Dict methods support a vectorized interface. Therefore, methods like gp.Dict.__getitem__, gp.Dict.__setitem__, and gp.Dict.__delitem__ can be performed with an np.ndarray. That allows the performance critical for-loop to happen within the compiled c++. Note that some dunder methods cannot be vectorized such as __contains__. Therefore, some keywords like in do not behave as expected. Those methods are renamed without the double underscores to note their deviation from the standard interface.

  3. If a key does not exist, gp.Dict.__getitem__ will return the default_value. If you do not specify the default_value, it will default to the default constructor of your data type (all 0 bits). If you would like to know the difference between a key that does not exist and a key that returns the default value, you should first run gp.contains on your key/array of keys, and then retrieve values corresponding to keys that exist.

  4. There is also a gp.MultiDict object. This object stores multiple unique values per key.

Examples

Simple Example

import numpy as np
import phashmap as gp

key_type = np.dtype('u8')
value_type = np.dtype('u8')

keys = np.random.randint(1, 1000, size=10 ** 2, dtype=key_type)
values = np.random.randint(1, 1000, size=10 ** 2, dtype=value_type)

gp_dict = gp.Dict(key_type, value_type)
gp_dict[keys] = values

Default Example

import numpy as np
import phashmap as gp

key_type = np.dtype('u8')
value_type = np.dtype('u8')

keys = np.random.randint(1, 1000, size=10 ** 2, dtype=key_type)
values = np.random.randint(1, 1000, size=10 ** 2, dtype=value_type)

gp_dict = gp.Dict(key_type, value_type, default_value=42)
gp_dict[keys] = values

random_keys = np.random.randint(1, 1000, size=500, dtype=key_type)
random_values = gp_dict[random_keys]

Byteset Example

import numpy as np
import phashmap as gp

key_type = np.dtype('S8')
value_type = np.dtype('S8')

keys = np.array([np.random.bytes(8) for i in range(10 ** 2)], dtype=key_type)
values = np.array([np.random.bytes(8) for i in range(10 ** 2)], dtype=value_type)

gp_dict = gp.Dict(key_type, value_type)
gp_dict[keys] = values

Multidimensional Example

import numpy as np
import phashmap as gp

key_type = np.dtype('u8')
value_type = np.dtype('u8')

keys = np.random.randint(1, 1000, size=10 ** 2, dtype=key_type).reshape(10, 10)
values = np.random.randint(1, 1000, size=10 ** 2, dtype=value_type).reshape(10, 10)

gp_dict = gp.Dict(key_type, value_type)
gp_dict[keys] = values

Bitpack Example

import numpy as np
import phashmap as gp

key_type = np.dtype('u8')
value_type = np.dtype('u8')

keys = np.random.randint(1, 1000, size=10 ** 2, dtype=np.dtype('u2')).reshape(25, 4).view(key_type)
values = np.random.randint(1, 1000, size=(10 ** 2) / 2, dtype=np.dtype('u4')).reshape(25, 2).view(value_type)

gp_dict = gp.Dict(key_type, value_type)
gp_dict[keys] = values

unpacked_values = gp_dict[keys].view(np.dtype('u4'))

Serialization Example

import numpy as np
import phashmap as gp

key_type = np.dtype('u8')
value_type = np.dtype('u8')

keys = np.random.randint(1, 1000, size=10 ** 1, dtype=key_type)
values = np.random.randint(1, 1000, size=10 ** 1, dtype=value_type)

gp_dict_1 = gp.Dict(key_type, value_type)
gp_dict_1[keys] = values
gp_dict_1.dump('test/test.hashtable.bin')

gp_dict_2 = gp.Dict(key_type, value_type)
gp_dict_2.load('test/test.hashtable.bin')

Supported Data Types

dict_types = {
    (np.dtype('u4'), np.dtype('u1')) : _gp.Dict_u4_u1,
    (np.dtype('u4'), np.dtype('u2')) : _gp.Dict_u4_u2,
    (np.dtype('u4'), np.dtype('u4')) : _gp.Dict_u4_u4,
    (np.dtype('u4'), np.dtype('u8')) : _gp.Dict_u4_u8,
    (np.dtype('u4'), np.dtype('i1')) : _gp.Dict_u4_i1,
    (np.dtype('u4'), np.dtype('i2')) : _gp.Dict_u4_i2,
    (np.dtype('u4'), np.dtype('i4')) : _gp.Dict_u4_i4,
    (np.dtype('u4'), np.dtype('i8')) : _gp.Dict_u4_i8,
    (np.dtype('u4'), np.dtype('f4')) : _gp.Dict_u4_f4,
    (np.dtype('u4'), np.dtype('f8')) : _gp.Dict_u4_f8,
    (np.dtype('u4'), np.dtype('S8')) : _gp.Dict_u4_S8,
    (np.dtype('u4'), np.dtype('S16')) : _gp.Dict_u4_S16,
    (np.dtype('u8'), np.dtype('u1')) : _gp.Dict_u8_u1,
    (np.dtype('u8'), np.dtype('u2')) : _gp.Dict_u8_u2,
    (np.dtype('u8'), np.dtype('u4')) : _gp.Dict_u8_u4,
    (np.dtype('u8'), np.dtype('u8')) : _gp.Dict_u8_u8,
    (np.dtype('u8'), np.dtype('i1')) : _gp.Dict_u8_i1,
    (np.dtype('u8'), np.dtype('i2')) : _gp.Dict_u8_i2,
    (np.dtype('u8'), np.dtype('i4')) : _gp.Dict_u8_i4,
    (np.dtype('u8'), np.dtype('i8')) : _gp.Dict_u8_i8,
    (np.dtype('u8'), np.dtype('f4')) : _gp.Dict_u8_f4,
    (np.dtype('u8'), np.dtype('f8')) : _gp.Dict_u8_f8,
    (np.dtype('u8'), np.dtype('S8')) : _gp.Dict_u8_S8,
    (np.dtype('u8'), np.dtype('S16')) : _gp.Dict_u8_S16,
    (np.dtype('i4'), np.dtype('u1')) : _gp.Dict_i4_u1,
    (np.dtype('i4'), np.dtype('u2')) : _gp.Dict_i4_u2,
    (np.dtype('i4'), np.dtype('u4')) : _gp.Dict_i4_u4,
    (np.dtype('i4'), np.dtype('u8')) : _gp.Dict_i4_u8,
    (np.dtype('i4'), np.dtype('i1')) : _gp.Dict_i4_i1,
    (np.dtype('i4'), np.dtype('i2')) : _gp.Dict_i4_i2,
    (np.dtype('i4'), np.dtype('i4')) : _gp.Dict_i4_i4,
    (np.dtype('i4'), np.dtype('i8')) : _gp.Dict_i4_i8,
    (np.dtype('i4'), np.dtype('f4')) : _gp.Dict_i4_f4,
    (np.dtype('i4'), np.dtype('f8')) : _gp.Dict_i4_f8,
    (np.dtype('i4'), np.dtype('S8')) : _gp.Dict_i4_S8,
    (np.dtype('i4'), np.dtype('S16')) : _gp.Dict_i4_S16,
    (np.dtype('i8'), np.dtype('u1')) : _gp.Dict_i8_u1,
    (np.dtype('i8'), np.dtype('u2')) : _gp.Dict_i8_u2,
    (np.dtype('i8'), np.dtype('u4')) : _gp.Dict_i8_u4,
    (np.dtype('i8'), np.dtype('u8')) : _gp.Dict_i8_u8,
    (np.dtype('i8'), np.dtype('i1')) : _gp.Dict_i8_i1,
    (np.dtype('i8'), np.dtype('i2')) : _gp.Dict_i8_i2,
    (np.dtype('i8'), np.dtype('i4')) : _gp.Dict_i8_i4,
    (np.dtype('i8'), np.dtype('i8')) : _gp.Dict_i8_i8,
    (np.dtype('i8'), np.dtype('f4')) : _gp.Dict_i8_f4,
    (np.dtype('i8'), np.dtype('f8')) : _gp.Dict_i8_f8,
    (np.dtype('i8'), np.dtype('S8')) : _gp.Dict_i8_S8,
    (np.dtype('i8'), np.dtype('S16')) : _gp.Dict_i8_S16,
    (np.dtype('S8'), np.dtype('u1')) : _gp.Dict_S8_u1,
    (np.dtype('S8'), np.dtype('u2')) : _gp.Dict_S8_u2,
    (np.dtype('S8'), np.dtype('u4')) : _gp.Dict_S8_u4,
    (np.dtype('S8'), np.dtype('u8')) : _gp.Dict_S8_u8,
    (np.dtype('S8'), np.dtype('i1')) : _gp.Dict_S8_i1,
    (np.dtype('S8'), np.dtype('i2')) : _gp.Dict_S8_i2,
    (np.dtype('S8'), np.dtype('i4')) : _gp.Dict_S8_i4,
    (np.dtype('S8'), np.dtype('i8')) : _gp.Dict_S8_i8,
    (np.dtype('S8'), np.dtype('f4')) : _gp.Dict_S8_f4,
    (np.dtype('S8'), np.dtype('f8')) : _gp.Dict_S8_f8,
    (np.dtype('S8'), np.dtype('S8')) : _gp.Dict_S8_S8,
    (np.dtype('S8'), np.dtype('S16')) : _gp.Dict_S8_S16,
    (np.dtype('S16'), np.dtype('u1')) : _gp.Dict_S16_u1,
    (np.dtype('S16'), np.dtype('u2')) : _gp.Dict_S16_u2,
    (np.dtype('S16'), np.dtype('u4')) : _gp.Dict_S16_u4,
    (np.dtype('S16'), np.dtype('u8')) : _gp.Dict_S16_u8,
    (np.dtype('S16'), np.dtype('i1')) : _gp.Dict_S16_i1,
    (np.dtype('S16'), np.dtype('i2')) : _gp.Dict_S16_i2,
    (np.dtype('S16'), np.dtype('i4')) : _gp.Dict_S16_i4,
    (np.dtype('S16'), np.dtype('i8')) : _gp.Dict_S16_i8,
    (np.dtype('S16'), np.dtype('f4')) : _gp.Dict_S16_f4,
    (np.dtype('S16'), np.dtype('f8')) : _gp.Dict_S16_f8,
    (np.dtype('S16'), np.dtype('S8')) : _gp.Dict_S16_S8,
    (np.dtype('S16'), np.dtype('S16')) : _gp.Dict_S16_S16,
}

set_types = {
    np.dtype('u4') : _gp.Set_u4,
    np.dtype('u8') : _gp.Set_u8,
    np.dtype('i4') : _gp.Set_i4,
    np.dtype('i8') : _gp.Set_i8,
    np.dtype('S8') : _gp.Set_S8,
    np.dtype('S16') : _gp.Set_S16,
}

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

phashmap-0.0.2-cp313-cp313-win_amd64.whl (2.3 MB view details)

Uploaded CPython 3.13Windows x86-64

phashmap-0.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (57.6 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

phashmap-0.0.2-cp312-cp312-win_amd64.whl (2.3 MB view details)

Uploaded CPython 3.12Windows x86-64

phashmap-0.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (57.6 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

phashmap-0.0.2-cp311-cp311-win_amd64.whl (2.1 MB view details)

Uploaded CPython 3.11Windows x86-64

phashmap-0.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (56.6 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

phashmap-0.0.2-cp310-cp310-win_amd64.whl (2.3 MB view details)

Uploaded CPython 3.10Windows x86-64

phashmap-0.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (56.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

phashmap-0.0.2-cp39-cp39-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.9Windows x86-64

phashmap-0.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (56.5 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

phashmap-0.0.2-cp38-cp38-win_amd64.whl (2.1 MB view details)

Uploaded CPython 3.8Windows x86-64

phashmap-0.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (56.6 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

phashmap-0.0.2-cp37-cp37m-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.7mWindows x86-64

phashmap-0.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (60.5 MB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ x86-64

File details

Details for the file phashmap-0.0.2-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: phashmap-0.0.2-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 2.3 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.11.9

File hashes

Hashes for phashmap-0.0.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 f1fa934901b98ed1fc5b6ec386af16e822d7e8eaf878ab88c938d079290199e2
MD5 df24d16ec050babab164bf152cb9fca8
BLAKE2b-256 763d6cf7787e97911076cdfe2e1dd00050f233e7a3d46b944b13252c2b0e5ce2

See more details on using hashes here.

File details

Details for the file phashmap-0.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for phashmap-0.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 bdee5aca776ebcfab52a9f907c1441080a9a1bb6b62a26760cd7f045616763a7
MD5 b6d7f84edfeda9ef2218d120c60faa8c
BLAKE2b-256 66ec17e9cbf3198fbc59b4d70d73aaa9c0fd90e109c1a49dd8d98b88831da356

See more details on using hashes here.

File details

Details for the file phashmap-0.0.2-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: phashmap-0.0.2-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 2.3 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.11.9

File hashes

Hashes for phashmap-0.0.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 bb11c3099e95cacc0ae79c64ac0f824c7ec24e3e9f86bf130ba0972755cf0fe7
MD5 e009d3df0470c474538e1c9b67f54087
BLAKE2b-256 4e7d7d77bf25da4fb8d29b4c55baf8110007a7d3266afb429bb41940dc236d6e

See more details on using hashes here.

File details

Details for the file phashmap-0.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for phashmap-0.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f8b0c053e45da4d39fa52f8a10ac76652430c0f456cf7e58448277d405224f10
MD5 17004dc3e720b4a4d5a5115c2c74bbf4
BLAKE2b-256 a04b270ec56846e0e757d895416405b50ba89e1db724a0400cd51748b95c18c8

See more details on using hashes here.

File details

Details for the file phashmap-0.0.2-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: phashmap-0.0.2-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.11.9

File hashes

Hashes for phashmap-0.0.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 36bb3bce502a5331b162f62cae63c5e5471f91f9e5be13ed196a59a365fa9d7d
MD5 270753475b5f0a43629a2262f5d218a0
BLAKE2b-256 e1dd78343b423878521b885ccf09df2e4d58a32115c89bc9dae97876d8401e2a

See more details on using hashes here.

File details

Details for the file phashmap-0.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for phashmap-0.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a29a8ba2427a85ac7db46aab809a64eef3f9cbb112d12d79bba21d34101d4202
MD5 73f2e819e1025ed2d566f6c82700b5ba
BLAKE2b-256 eae529a8e3672178c87431d601e12c45ac117b8a35ed867b12c6b8c02d78e655

See more details on using hashes here.

File details

Details for the file phashmap-0.0.2-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: phashmap-0.0.2-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 2.3 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.11.9

File hashes

Hashes for phashmap-0.0.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 3898e5f279354a6c7df9c4f33bc9653e3d966f5f6e1de49db5bed787792413fb
MD5 4d867ab7f0bce7f92afea4a4e4a0f045
BLAKE2b-256 851f791b34f219767b4ab682e9ee18aac41a61b9f25604431cc1edb7e3073d3e

See more details on using hashes here.

File details

Details for the file phashmap-0.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for phashmap-0.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4e929b9e83152711b76c93bc2b149f44a5800d8272bc3aabefebe36d0bb11f44
MD5 629c9d91fe751ea9f8323c978fd33aa9
BLAKE2b-256 2c0a825e9c99a3ab415a7d66d037a97575a4e8dde5becf88e77aa6e23765c241

See more details on using hashes here.

File details

Details for the file phashmap-0.0.2-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: phashmap-0.0.2-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.11.9

File hashes

Hashes for phashmap-0.0.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 5b45ef0c56d829a09fb3f4b5e46bffbcec6f19829e4f2ed6bddcff0e0982ed6a
MD5 960ca706428cbd8b94a00dd2bab836f5
BLAKE2b-256 b21b8321b7c3f8880c217476daf20e148ed0719bf1b71d40c6797b575ad09594

See more details on using hashes here.

File details

Details for the file phashmap-0.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for phashmap-0.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fd76c0703e3a339079f63e85e32d890909bf54029e3d798d990467a2caf888e6
MD5 b189c2f481ea0d51c92a6b79c5f5483a
BLAKE2b-256 ba2530662e78ad65ce75d2f6d556737f2b0d2a45b622e76b6b7fd4f5e031806d

See more details on using hashes here.

File details

Details for the file phashmap-0.0.2-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: phashmap-0.0.2-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.11.9

File hashes

Hashes for phashmap-0.0.2-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 3081aa9fd698842ac1511d706ef73e72c0f7c6f3a81341aafe3a6aa943f21ca6
MD5 415a90139e1bfd63142f35033347e648
BLAKE2b-256 ea563400da7ff4f2027fc31a7ecdd3698c744b720a662604ff7a9a97dc73a223

See more details on using hashes here.

File details

Details for the file phashmap-0.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for phashmap-0.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c179677e7bc5e4a6e11e82d528af77f463430e6552122d1b6ac867f493a40755
MD5 e354e55fce28bd0fbfac34af11550aab
BLAKE2b-256 9c5057d03e8317d77290a5b98d9a5e17e78d718b8bff23c709a2009409687a32

See more details on using hashes here.

File details

Details for the file phashmap-0.0.2-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: phashmap-0.0.2-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.11.9

File hashes

Hashes for phashmap-0.0.2-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 f71b5b92a0edc40d735e780b098da66efce9b8dc2135d13c3ef8247aa7cabe8b
MD5 b581aee58e00fcb9ab9e39f3c545411b
BLAKE2b-256 2a4b5a3fae3e1761f98202ecaab8ae7de181051298b6e23c47fe469a8f461a76

See more details on using hashes here.

File details

Details for the file phashmap-0.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for phashmap-0.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9d6f11c6fd6273052a03c18c7c0d160ade0a7a1c9cd236293f43f1ade434ed8e
MD5 01a4c5821ae482200eeaee1afa5426e4
BLAKE2b-256 faadc725ce0739a28e703d7d79933ffeb788de243f7b49b11f3e88399c6f427a

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