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.3-cp313-cp313-win_amd64.whl (3.1 MB view details)

Uploaded CPython 3.13Windows x86-64

phashmap-0.0.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (65.9 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

phashmap-0.0.3-cp312-cp312-win_amd64.whl (3.1 MB view details)

Uploaded CPython 3.12Windows x86-64

phashmap-0.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (65.9 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

phashmap-0.0.3-cp311-cp311-win_amd64.whl (3.0 MB view details)

Uploaded CPython 3.11Windows x86-64

phashmap-0.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (65.9 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

phashmap-0.0.3-cp310-cp310-win_amd64.whl (3.1 MB view details)

Uploaded CPython 3.10Windows x86-64

phashmap-0.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (65.8 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

phashmap-0.0.3-cp39-cp39-win_amd64.whl (2.4 MB view details)

Uploaded CPython 3.9Windows x86-64

phashmap-0.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (65.8 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

phashmap-0.0.3-cp38-cp38-win_amd64.whl (3.0 MB view details)

Uploaded CPython 3.8Windows x86-64

phashmap-0.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (65.8 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

phashmap-0.0.3-cp37-cp37m-win_amd64.whl (1.9 MB view details)

Uploaded CPython 3.7mWindows x86-64

phashmap-0.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (65.2 MB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ x86-64

File details

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

File metadata

  • Download URL: phashmap-0.0.3-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 3.1 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.3-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 ee03726ed4b84ca785290891ee026fe98fdbc932c37ca10ae715d32f98580e6f
MD5 236bbf729733364f57d608564c7bae05
BLAKE2b-256 0cb3961688986e29841fc6076322429fcad97c063c7f0e964a9c12a26bce64dd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for phashmap-0.0.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b3e4594c183a2fec9b18dac99f161e153c962153ea9f66ba72bc3ae97a65d849
MD5 3aa7cabb2bef9637a3cc51ed4e5bf844
BLAKE2b-256 26dfa59d3b86d5fbaf685193b9685e41bd875f757a0ef956745f03ec8e0126c7

See more details on using hashes here.

File details

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

File metadata

  • Download URL: phashmap-0.0.3-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 3.1 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.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 9532048a265d31e997b79db40a3d30b11a642155cb17e82e7df72df124846f65
MD5 8e47dbbd03b42fe640e5b5148572524d
BLAKE2b-256 01bee66045cfc5a3b1e3f5a421c477bb74ab7b606aeefebfdc33df2edd34c169

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for phashmap-0.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 013dc02ad2dc0e39fb5e97097668176b12d1ef15063843ae8a31eeb89be49422
MD5 b4d636a3a3d662b6505633f6650316a5
BLAKE2b-256 b875c0d3da5a7c27a1dffd9f9e3f70398742eda2aa56a430258a4f65cee8dacc

See more details on using hashes here.

File details

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

File metadata

  • Download URL: phashmap-0.0.3-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 3.0 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.3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 ee9bca685f05f62b2314caddc2e502024cef2ba80382653bec51f6356b2a85e0
MD5 36c42b8b10a16df34730d1b455a54ced
BLAKE2b-256 1a2f893bd6eca4c30bd5170bc2efc22ef9d154e5e25a90824f636b4b4f1ef8d0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for phashmap-0.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e79eab659dbb20b286a67222e632694628cd789c04ff33e5c5351699035416f9
MD5 13739737a2f91e36737404f11321b725
BLAKE2b-256 3ba5d916aed8d38e1d5da81e8f5b1bbaa14f11a3950e54e3eb9eebfee8143ae7

See more details on using hashes here.

File details

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

File metadata

  • Download URL: phashmap-0.0.3-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 3.1 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.3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 fa669f58bc17309742147fbc42c6c116da9dcdc1c9e41fef92bb5b27e6605e68
MD5 26871a38ee9faa06f8f525d31427f33f
BLAKE2b-256 5f7f144e9eba7a88e38bc932636530267d587ed5a9c4ff586bd0670e8f37dccb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for phashmap-0.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e647397782c4cb55fdf35387b1815d43e2d29f7413c96a19e71addd3bffd9e72
MD5 7d85bee41b52334f360ad3473800d4a0
BLAKE2b-256 b28ccd5e2101174449d2117edd47c01521483ebd7a9d7c610226f4d404e39313

See more details on using hashes here.

File details

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

File metadata

  • Download URL: phashmap-0.0.3-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 2.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.3-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 37d47b06db85a1fc593ac2f622f5f6a38544b513ce1861a14928ab7130acab77
MD5 a1cc5f6af53d039e7b9b1f9e84fab322
BLAKE2b-256 88ea3096acd0c2c2ea9baacb205923811e98681933c8001c2bb0572afde9f56c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for phashmap-0.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6e21233f9ca355d33fa6447f4f17a46e4faed0e2fa74e188179385353f9ca921
MD5 00ee8c4ddd93b0937d1db8c1bf3c24eb
BLAKE2b-256 aaf334f4bfcd2d6820f0b8a3fe1b6c6b3f1013e0bc15b4dc866ee317a54ee4cc

See more details on using hashes here.

File details

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

File metadata

  • Download URL: phashmap-0.0.3-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 3.0 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.3-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 24b60a9d5d5ab82a99c67e059e5e0c82babe7e7e61e21e20745062003620ce5b
MD5 9b8153ae62585a1996782e1e413e39a5
BLAKE2b-256 58a5317d94423e4225e54e7e2cacfb47c721651d9fe02a612980c356e2b818d0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for phashmap-0.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b89e332aad9a376bb19cd1a0420ae86b2632d9220c832c10335088d07aeaab8d
MD5 939a006741e98c2337e97f2e04133cfc
BLAKE2b-256 6ff1a1f65b7a6fe9e9d9350f2f6f5272a681fb746b5e7c87af20ffa8ec75a49e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: phashmap-0.0.3-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 1.9 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.3-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 2154d04f11129fc1355c962a5bc78d9ecc4709bac84cd19e052cb85064841475
MD5 16c7a6904a51c7ee63106de2781c4f87
BLAKE2b-256 d1954bb3ef7e492a62b82d23c2f538e4df6040bd200b37659b5f84fef1b414b0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for phashmap-0.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 89328dd29636aa604ea7bfd4b39fcb321c198411343a4e52c89ab8c24e395890
MD5 a8abd326e6ab782eb13d0af1995aaeeb
BLAKE2b-256 d84b148026939f273b480cf325c9f8fae1c041a95cf36e496d15b1ae0b87865a

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