Skip to main content

Fast and compact maps and sets with Billions of keys, based on finite-state-transducers.

Project description

Ducer documentation

This package provides fast and compact read-only maps and sets that scale up to Billions of keys, while being light on resources with a streamable file format. Complex search patterns that would be infeasible with Python's builtin dict and set are not just possible, but very efficient. All of these amazing things are achieved with finite-state-transducers provided by the excellent Rust crate fst by Andrew Gallant.

Performance

Ducer maps and sets can be built and queried at millions of keys per second. Consider the following example:

import ducer
n = 1_000_000_000
items = ((b"%09d" % i, n-i) for i in range(n))
data = ducer.Map.build(":memory:", items)
m = Map(data)
assert m[b"900000000"] == 100_000_000

In our example, most of the time is spent in Python creating item tuples. Regardless, building happens at almost 4 Million items per second on my humble laptop. Retrieving individual keys is similarly speedy, and simply iterating over all items is twice as fast at 8 Million items per second.

This toy example is almost a best case for FSTs, so the resulting output is just 464 bytes. A real-world example with 1.1 Billion keys, where the key-value pairs occupy 21 GiB without any kind of searchability (stored in already quite compact msgpack format), results in a 4.6 GiB file. Building and retrieval are naturally a bit slower, but still within the 2-3 Million items per second range.

Limitations

Performance is rarely free, so there are some limitations you should consider before proceeding:

  • Keys must be bytes
  • Keys must be inserted in lexicographical order
  • Map values must be non-negative integers less than 2^64
  • Once built, maps and sets cannot be altered

Installation

Most users should be able to simply do:

pip install ducer

To build from source you will need a recent Rust toolchain. Use your preferred method of installation, or follow the official instructions to install Rust. Then run the following at the toplevel of the repository:

pip install .

Building

Above, we already showed that Map.build can build maps in memory by passing ":memory:" as path:

data = ducer.Map.build(":memory:", items)

If you pass any other path (either str or Path; the parent directory must exist), your map will be written directly to that file:

ducer.Map.build("path/to/my.map", items)

Building a map like this uses virtually no extra memory.

Opening

One key advantage of ducer maps is streamability. Unlike the builtin dict, a Map does not have to reside entirely in memory. You can, e.g., use the builtin mmap to stream map data:

with open("path/to/my.map", "rb") as f:
    mm = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
m = ducer.Map(mm)

Note that you can safely close the file once the mmap is created. See mmap(2) for details.

Thanks to high compression ratios, pre-loading maps entirely into memory can be feasible. In our experience, at least for local SSD storage, performance is virtually identical, expect pre-loading data takes extra time. Pre-loading can still make sense though, e.g., with networked storage.

with open("path/to/my.map", "rb") as f:
    data = f.read()
m = ducer.Map(data)

Access

To the extent that it's feasible, Map and Set are intended to be direct replacements for the builtin Python dict and set. For m, o: Map and k: bytes, the following works as intended:

k in m
m == o
m[k]
m.get(k)
m.get(k, 42)
len(m)
for k in m:
    pass
for k in m.keys():
    pass
for v in m.values():
    pass
for k, v in m.items():
    pass

For s, o: Set, and k: bytes, the following works as intended:

k in s
s == o
len(s)
for k in s:
    pass
s.isdisjoint(o)
s.issubset(o)
s <= o  # subset
s < o  # proper subset
s.issuperset(o)
s >= o  # superset
s > o  # proper superset

Note: Comparison operations are currently only implemented for other Set objects, not the builtin set. This may change in a future version if there is demand for it.

Differences to builtins

Not implemented

Since Map is immutable, the following are not implemented:

  • clear
  • fromkeys
  • pop
  • popitem
  • setdefault
  • update, |=

Since Set is immutable, the following are not implemented:

  • add
  • clear
  • difference_update, -=
  • discard
  • intersection_update, &=
  • pop
  • remove
  • symmetric_difference_update, ^=
  • update, |=

Further, the |, &, -, ^ operators are also not implemented, since it is not possible to specify the storage path. Use the respective union, intersection, difference, and symmetric_difference methods instead.

Incompatible syntax

difference, intersection, symmetric_difference, and union have slightly different syntax to accomodate the necessary path. For s: Set and others: Iterable[Set]:

s.difference("path/to/result.set", *others)
s.intersection("path/to/result.set", *others)
s.symmetric_difference("path/to/result.set", *others)
s.union("path/to/result.set", *others)

Like the standard library, difference will create the set of all elements of s that are not present in others.

Set operations on maps

Unlike the builtin dict, the ducer Map offers set operations. The syntax is the same as for sets:

m.difference("path/to/result.map", *others)
m.intersection("path/to/result.map", *others)
m.symmetric_difference("path/to/result.map", *others)
m.union("path/to/result.map", *others)

To resolve conflicts between keys present in multiple maps, a list of possible values is assembled. If the key is present in self, then it will be the first value. Values from others are added in given order. By default the last values in the list is used to mimic the behavior of dict.update. Currently, you can choose between these pre-defined operations:

Some examples:

m1 = ducer.Map(ducer.Map.build(":memory:", [(b"k1", 1), (b"k2", 1)]))
m2 = ducer.Map(ducer.Map.build(":memory:", [(b"k2", 2), (b"k3", 2)]))
m3 = ducer.Map(ducer.Map.build(":memory:", [(b"k3", 3)]))
mu = ducer.Map(m1.union(":memory:", m2, m3))
print(dict(mu.items()))
# {b'k1': 1, b'k2': 2, b'k3': 3}
mu = ducer.Map(m1.union(":memory:", m2, m3, select=ducer.Op.First))
print(dict(mu.items()))
# {b'k1': 1, b'k2': 1, b'k3': 2}

Advanced search patterns

The underlying FSTs allow for some advanced search patterns that would otherwise be costly to implement on top of dict and set. Most basic, you can iterate over a range of keys, where ge = greater or equals, gt = greater than, le = less than or equals, and lt = less than:

m.range(ge=b"key17", lt=b"key42")
m.range(gt=b"key17", le=b"key42")

For maps this yields key-value tuples, meaning m.range() without limits is equivalent to m.items().

You can also iterate over all keys that start with a certain prefix, with optional limits same as range:

m.starts_with(b"key", ge=b"key17", lt=b"key42")
m.starts_with(b"key", gt=b"key17", le=b"key42")

You can also search for subsequences , e.g., all keys matching *k*7*, again with optional limits:

m.subsequence(b"k7", ge=b"key17", lt=b"key42")
m.subsequence(b"k7", gt=b"key17", le=b"key42")

Finally, you can create an Automaton to create your own search patterns. The following automata are available:

For example, to recreate Map.starts_with, you can use the following automata with the Map.search method:

a = ducer.Automaton.str(b"key").starts_with()
m.search(a)

Add complement to search for keys that do not start with the string:

a = ducer.Automaton.str(b"key").starts_with().complement()
m.search(a)

Finally, you can combine multiple automata, e.g. with union:

a1 = ducer.Automaton.str(b"key").starts_with()
a2 = ducer.Automaton.str(b"other").starts_with()
a = a1.union(a2)
m.search(a)

Acknowledgements

Ducer is supported by the SustainML project.

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

ducer-1.0.3.tar.gz (39.5 kB view details)

Uploaded Source

Built Distributions

ducer-1.0.3-cp313-cp313-win_amd64.whl (271.8 kB view details)

Uploaded CPython 3.13 Windows x86-64

ducer-1.0.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (342.1 kB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ x86-64

ducer-1.0.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (322.7 kB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ ARM64

ducer-1.0.3-cp313-cp313-macosx_11_0_arm64.whl (307.6 kB view details)

Uploaded CPython 3.13 macOS 11.0+ ARM64

ducer-1.0.3-cp313-cp313-macosx_10_13_x86_64.whl (322.1 kB view details)

Uploaded CPython 3.13 macOS 10.13+ x86-64

ducer-1.0.3-cp312-cp312-win_amd64.whl (271.8 kB view details)

Uploaded CPython 3.12 Windows x86-64

ducer-1.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (342.1 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

ducer-1.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (322.7 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARM64

ducer-1.0.3-cp312-cp312-macosx_11_0_arm64.whl (307.6 kB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

ducer-1.0.3-cp312-cp312-macosx_10_9_x86_64.whl (322.1 kB view details)

Uploaded CPython 3.12 macOS 10.9+ x86-64

ducer-1.0.3-cp311-cp311-win_amd64.whl (267.4 kB view details)

Uploaded CPython 3.11 Windows x86-64

ducer-1.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (340.9 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

ducer-1.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (321.6 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

ducer-1.0.3-cp311-cp311-macosx_11_0_arm64.whl (306.4 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

ducer-1.0.3-cp311-cp311-macosx_10_9_x86_64.whl (322.5 kB view details)

Uploaded CPython 3.11 macOS 10.9+ x86-64

ducer-1.0.3-cp310-cp310-win_amd64.whl (267.6 kB view details)

Uploaded CPython 3.10 Windows x86-64

ducer-1.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (341.0 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

ducer-1.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (321.7 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

ducer-1.0.3-cp310-cp310-macosx_11_0_arm64.whl (306.6 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

ducer-1.0.3-cp310-cp310-macosx_10_9_x86_64.whl (322.6 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

ducer-1.0.3-cp39-cp39-win_amd64.whl (268.5 kB view details)

Uploaded CPython 3.9 Windows x86-64

ducer-1.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (341.6 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

ducer-1.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (322.4 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

ducer-1.0.3-cp39-cp39-macosx_11_0_arm64.whl (307.2 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

ducer-1.0.3-cp39-cp39-macosx_10_9_x86_64.whl (323.2 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

ducer-1.0.3-cp38-cp38-win_amd64.whl (268.6 kB view details)

Uploaded CPython 3.8 Windows x86-64

ducer-1.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (341.7 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

ducer-1.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (322.6 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

ducer-1.0.3-cp38-cp38-macosx_11_0_arm64.whl (307.3 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

ducer-1.0.3-cp38-cp38-macosx_10_9_x86_64.whl (323.4 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

File details

Details for the file ducer-1.0.3.tar.gz.

File metadata

  • Download URL: ducer-1.0.3.tar.gz
  • Upload date:
  • Size: 39.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for ducer-1.0.3.tar.gz
Algorithm Hash digest
SHA256 c6b6b9656d067eacbab3b4c7b12170b051e77676d3e758c6d73fbeac044f44fd
MD5 8ff558c3957525e71fe1bc6c83da188a
BLAKE2b-256 4aae867b1c4b520bb4458ddcb38fcd27edb6b48130ee236190200eb405603a24

See more details on using hashes here.

File details

Details for the file ducer-1.0.3-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: ducer-1.0.3-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 271.8 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for ducer-1.0.3-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 0de745ee3e5fc7d241a3a4f8d96f792256efa583e943a15324653d79d3f8e044
MD5 59fc23ea4643c539b9340f7f04d009c5
BLAKE2b-256 c3773847e7967477689491fd387cb8ea4d1d47464d4e2302b66397e01c6ef75f

See more details on using hashes here.

File details

Details for the file ducer-1.0.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ducer-1.0.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1bee5b65e65b0bfc8e2459b40e4a569320ad0ec72772ef8ea5d1da1eb89623d3
MD5 7f5cc076c37cd309fb4d7f5d8518a20d
BLAKE2b-256 051231fb9dc45ea9ca2cb688e3ff7cd85e983ad08093124e91a17b8e8ae0c17b

See more details on using hashes here.

File details

Details for the file ducer-1.0.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for ducer-1.0.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 abf272829a82c6f4846ed409fabb628f787651b951c31d280026465a716d3950
MD5 7941cb237d4ac52bcd803a292397027a
BLAKE2b-256 929289f534459b1d85bfa74d266218d58ae17f3cf088150ffd8de1669ed757d4

See more details on using hashes here.

File details

Details for the file ducer-1.0.3-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ducer-1.0.3-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 32c4132b78a18847906068db9867e165e1ef97e3810b118e28b69016be030030
MD5 b97ce8aed9766bf27d0c33d62514a6ee
BLAKE2b-256 82af0bf55c4f118ae06d70d502875161f86b370257df2d538fb1f463ad604171

See more details on using hashes here.

File details

Details for the file ducer-1.0.3-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for ducer-1.0.3-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 5d5c5532b26a8355845521e7b3b09368d48532d39a35f52a523ffc69ea5de95f
MD5 4284ea048f023a50ae15931d3a410b25
BLAKE2b-256 6b97d305726c55f15c3e9e911911b5a746603872231b5cbdbf15dc4d03082bde

See more details on using hashes here.

File details

Details for the file ducer-1.0.3-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: ducer-1.0.3-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 271.8 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for ducer-1.0.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 ea8836f2ff35012e4b1f7ee2f4b114c0e28903158b76ef71dc9e7d67f56a0dfd
MD5 d6875469fbd58bc3a030985c943e5764
BLAKE2b-256 43b30dcef1e13ff260807b0a19d95a885f104aac9881a24812cd1f02384a281a

See more details on using hashes here.

File details

Details for the file ducer-1.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ducer-1.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 24a302546bca85ce1ff32a78a9187c6b93924f788a887d4028fe27b86c559f1d
MD5 526eb309ecb9ca9016feabdb4409c6a9
BLAKE2b-256 70d51675cd38d3f11fe3de19e54429233c4a91f0d610e22dd290efa5a88dca09

See more details on using hashes here.

File details

Details for the file ducer-1.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for ducer-1.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 7ba36d5e54a32ba068f44f180058319cccfce2dc3d5eaf77709ed2b46d6aedc0
MD5 c51099975046a01497bb95c4fcf186da
BLAKE2b-256 c034dee80bd2b862c4ecc23a859ab2051ac2d4412b1ef1c8440f650f3924f4f9

See more details on using hashes here.

File details

Details for the file ducer-1.0.3-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ducer-1.0.3-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7823babf6004f970d639ceb45d30191cbb05b781a0b9766cf044e7c06bdd7a40
MD5 9773adf2d30fe931c5b9c45d41254023
BLAKE2b-256 f78448fd8ba45d565221ee6cb684e78f93ef34bba590554165c0f633e801de0c

See more details on using hashes here.

File details

Details for the file ducer-1.0.3-cp312-cp312-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for ducer-1.0.3-cp312-cp312-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c7bca7cf5bcdf9d51e045fbd80eeae00ea3232c873f9e81dd1580c92f5edc9dc
MD5 ae8a1bc5a73c51e4af97f34d01467488
BLAKE2b-256 dbce06b6cf6ddacbf3d70f2cc9fa1dcf8c7a6ef3c1e78682cc5c248141753035

See more details on using hashes here.

File details

Details for the file ducer-1.0.3-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: ducer-1.0.3-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 267.4 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for ducer-1.0.3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 9432cc54826181daccf0723121a6fd369909244bab38cbeeecddedaa3bc6740e
MD5 fa3eecf8a63b41961d0adb6e2a44516c
BLAKE2b-256 8e8ca877e149441b240e0a4d5c691faa353b859723d81d9cdffc70f664230aed

See more details on using hashes here.

File details

Details for the file ducer-1.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ducer-1.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 91f93dffe44af33d3549905b135d7de3196d7b72b03c988e1c4eb0fa7b2b9c8d
MD5 a184ae588e22b927c5887fc12e5f9d3b
BLAKE2b-256 cb63299a6fbfeb5c31ac55122f5683f3d4b590f86aab6208cc0681eb561651ba

See more details on using hashes here.

File details

Details for the file ducer-1.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for ducer-1.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 578b064ba7344feafecc77471e62d0393749dffdf1a29673b7a971f9cca1460c
MD5 bf5458f377200e68e0c4035926f27d5c
BLAKE2b-256 7ee7bdda5387c7903a9768865123d442ed7bcfdca8214031d8c90d19ece762d2

See more details on using hashes here.

File details

Details for the file ducer-1.0.3-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ducer-1.0.3-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1c97074894edad853d8efc758e2153c66d08c14c655b4de8f85b070381a40336
MD5 2f240d7ad7558a282c497e7528d743b7
BLAKE2b-256 01f9ea3f523b18c3924e4d3d66499116e1bb2a29e208a34c4fd35c547cfebaa3

See more details on using hashes here.

File details

Details for the file ducer-1.0.3-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for ducer-1.0.3-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 7a0fde0e119cde4479748aee3cbb50c2d9a10dbd98ead79a565f521941b64ecb
MD5 0cca1192eb4807172dce291dabefc406
BLAKE2b-256 6c3f597621a97132897a95f401eb1c0ac6ad173b6ab28ed75b52ac0e855800d4

See more details on using hashes here.

File details

Details for the file ducer-1.0.3-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: ducer-1.0.3-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 267.6 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for ducer-1.0.3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 48e701530c7cdd33088307ead55eb77c5631db17bc92580b56d79c3dfef5ffd7
MD5 2ca9aefba01edecd8dfa7d266bd5d2be
BLAKE2b-256 59aca51de2c9257b49e61df874577057994c37535d7cc87b33203cf5072780f7

See more details on using hashes here.

File details

Details for the file ducer-1.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ducer-1.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 73311656b72f754a769c0f747cbdd77b088b115badcdb1513097db06897b29cd
MD5 55c1a4207f5efc9fc1a41f197352cad2
BLAKE2b-256 120b36d30d7f547f1571e618c4c06bcfe3292b751938f878181e45cdf4b99931

See more details on using hashes here.

File details

Details for the file ducer-1.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for ducer-1.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 73fb0b0ed9148dbf950545899b74d1f3d75b51e451b6ec0f0b275c2f594733ea
MD5 06ef9ce407f3221742b75443df22287f
BLAKE2b-256 e93c9de02a0a4b8dfe75b754d950d49e20acbedba704f292221a04693a18ba99

See more details on using hashes here.

File details

Details for the file ducer-1.0.3-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ducer-1.0.3-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2b897e56d5dcef98365df2db52ee6b138f2008ac588acb59cec42242542edcc3
MD5 4798664c6a30bbd1c25090f96d66df68
BLAKE2b-256 ee885c379fc218770ee3dbf580a9cd1e23a480854ad5dd5df6da6dd2139eb3bd

See more details on using hashes here.

File details

Details for the file ducer-1.0.3-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for ducer-1.0.3-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 40199d4124a8409f7e592a8013ada7de6fe12770dc0c3b1fe55d19e584758bb1
MD5 f033b9ca7cd24b6f5cdf4ecef4841761
BLAKE2b-256 6a4ccf84f9a6c4b49092d815b7cd5993e6888bd33dc32547223c632e2f5b15a4

See more details on using hashes here.

File details

Details for the file ducer-1.0.3-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: ducer-1.0.3-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 268.5 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for ducer-1.0.3-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 170665334793580446e8f4c08e04139388b38f250df42c1ac22a5399bc54ac14
MD5 e92c2d286be9ef6af6c82869ae7b12cf
BLAKE2b-256 2958578dbcc034f5f2b8e77f06ba686a785d33d539ef28b5f2e06c3635fefade

See more details on using hashes here.

File details

Details for the file ducer-1.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ducer-1.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6917f6b483a17bc577a942d62a8dc3216819510c8873ea19fa9497e905bb2d24
MD5 ed2eaa18a9af27a3af1417f481d14d1e
BLAKE2b-256 eeb3071894ca2cf7b2edbea80b8850fac9a10dfd8403946da779de0699a8d7e3

See more details on using hashes here.

File details

Details for the file ducer-1.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for ducer-1.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ce77de43505e71749bab32a7d74f1032853fa0ab15cfc9c981cf1b8fe09e29dc
MD5 4830320c8a72ac7be1b146e6a69bc7ff
BLAKE2b-256 602eedc06f2f12b653e19593553357415eecc71b642ff33b444e14198482a8b1

See more details on using hashes here.

File details

Details for the file ducer-1.0.3-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ducer-1.0.3-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2600e6104eac9462ed11246a4a8a26c8e8f7a7ea74260cb0d764f20997082d56
MD5 d28c50bb0199e9d3ee3a8f38d63da2ff
BLAKE2b-256 fdde18dc67242a702909726adb126909602e7c41f0c7db2650da8eff2540ff8f

See more details on using hashes here.

File details

Details for the file ducer-1.0.3-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for ducer-1.0.3-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 560068f370b7c252f430b3b8a4f13f6a74bd8522d7bb7f6be68ba3340bd46247
MD5 4afad6c3eaf3c829480a9644edbb2688
BLAKE2b-256 372adfcfddf6d5db546708125321ce0b06cb0dec395d37958a3a04e7d7d220a8

See more details on using hashes here.

File details

Details for the file ducer-1.0.3-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: ducer-1.0.3-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 268.6 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for ducer-1.0.3-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 55a86ec3257df9bce1607a49aa829c9e550284494ac3829ec2c752bdd5a816ae
MD5 b96b36a199abf3022a0f0aedfad3064d
BLAKE2b-256 f3dde7f19b9e06de8f6bd96429eb034046b0b8c48b8a6f7bf8bf3249e8be4962

See more details on using hashes here.

File details

Details for the file ducer-1.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ducer-1.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0620b97ba1996f10b41521e6c13bc486e3d479c8a368d85e36c1d04d52065581
MD5 43c7a3119e973ded34e01b320c6ee91f
BLAKE2b-256 1e4ada283301d9899736c946cce61cfab9e38e0b957c31d126195d340b17a935

See more details on using hashes here.

File details

Details for the file ducer-1.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for ducer-1.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2699e9f6aafe1c08bfcc7bf9c47e53616b625c52c1764fb744e9591edb9ce7bb
MD5 6b3358ec418e62c3b9f685d9c0f901ce
BLAKE2b-256 5dc0d99c7e2eccb83a6c91bd73ba48f917410f0152ac70c49f3ad4707cadbe8f

See more details on using hashes here.

File details

Details for the file ducer-1.0.3-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ducer-1.0.3-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 135dc100250556a3b261829eece644559bdb42c63e67968599cdd358431b9102
MD5 ce075c768913b8328159cb736d1af297
BLAKE2b-256 5afb7a644f5aa8f53c5c42e0652d8d7bb87439779fe70d439ccd3010dc275951

See more details on using hashes here.

File details

Details for the file ducer-1.0.3-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for ducer-1.0.3-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c3b67b485ca732b9606f8d2eda93f0d8619ae49ef3a4df17a40165114150ff54
MD5 9bfec06569d63a035196ff18597ca842
BLAKE2b-256 61cfed0f16c39391361c0408cbb41ef2291713330be52ab459bc1d911400dfa5

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