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 Albatross and SustainML projects.

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.2.0.tar.gz (39.4 kB view details)

Uploaded Source

Built Distributions

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

ducer-1.2.0-cp314-cp314-win_arm64.whl (262.4 kB view details)

Uploaded CPython 3.14Windows ARM64

ducer-1.2.0-cp314-cp314-win_amd64.whl (285.3 kB view details)

Uploaded CPython 3.14Windows x86-64

ducer-1.2.0-cp314-cp314-manylinux_2_28_x86_64.whl (343.5 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

ducer-1.2.0-cp314-cp314-manylinux_2_28_aarch64.whl (325.1 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ ARM64

ducer-1.2.0-cp314-cp314-macosx_11_0_arm64.whl (312.7 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

ducer-1.2.0-cp314-cp314-macosx_10_13_x86_64.whl (336.2 kB view details)

Uploaded CPython 3.14macOS 10.13+ x86-64

ducer-1.2.0-cp313-cp313-win_arm64.whl (253.3 kB view details)

Uploaded CPython 3.13Windows ARM64

ducer-1.2.0-cp313-cp313-win_amd64.whl (275.0 kB view details)

Uploaded CPython 3.13Windows x86-64

ducer-1.2.0-cp313-cp313-manylinux_2_28_x86_64.whl (342.8 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

ducer-1.2.0-cp313-cp313-manylinux_2_28_aarch64.whl (324.0 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ ARM64

ducer-1.2.0-cp313-cp313-macosx_11_0_arm64.whl (312.1 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

ducer-1.2.0-cp313-cp313-macosx_10_13_x86_64.whl (335.7 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

ducer-1.2.0-cp312-cp312-win_arm64.whl (253.4 kB view details)

Uploaded CPython 3.12Windows ARM64

ducer-1.2.0-cp312-cp312-win_amd64.whl (275.1 kB view details)

Uploaded CPython 3.12Windows x86-64

ducer-1.2.0-cp312-cp312-manylinux_2_28_x86_64.whl (342.9 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

ducer-1.2.0-cp312-cp312-manylinux_2_28_aarch64.whl (324.0 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

ducer-1.2.0-cp312-cp312-macosx_11_0_arm64.whl (312.0 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

ducer-1.2.0-cp312-cp312-macosx_10_13_x86_64.whl (335.7 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

ducer-1.2.0-cp311-cp311-win_arm64.whl (253.0 kB view details)

Uploaded CPython 3.11Windows ARM64

ducer-1.2.0-cp311-cp311-win_amd64.whl (275.0 kB view details)

Uploaded CPython 3.11Windows x86-64

ducer-1.2.0-cp311-cp311-manylinux_2_28_x86_64.whl (344.2 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

ducer-1.2.0-cp311-cp311-manylinux_2_28_aarch64.whl (325.5 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ ARM64

ducer-1.2.0-cp311-cp311-macosx_11_0_arm64.whl (311.9 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

ducer-1.2.0-cp311-cp311-macosx_10_12_x86_64.whl (335.4 kB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

ducer-1.2.0-cp310-cp310-win_arm64.whl (253.2 kB view details)

Uploaded CPython 3.10Windows ARM64

ducer-1.2.0-cp310-cp310-win_amd64.whl (275.2 kB view details)

Uploaded CPython 3.10Windows x86-64

ducer-1.2.0-cp310-cp310-manylinux_2_28_x86_64.whl (344.4 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

ducer-1.2.0-cp310-cp310-manylinux_2_28_aarch64.whl (325.7 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ ARM64

ducer-1.2.0-cp310-cp310-macosx_11_0_arm64.whl (312.1 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

ducer-1.2.0-cp310-cp310-macosx_10_12_x86_64.whl (335.9 kB view details)

Uploaded CPython 3.10macOS 10.12+ x86-64

ducer-1.2.0-cp39-cp39-win_arm64.whl (255.2 kB view details)

Uploaded CPython 3.9Windows ARM64

ducer-1.2.0-cp39-cp39-win_amd64.whl (277.2 kB view details)

Uploaded CPython 3.9Windows x86-64

ducer-1.2.0-cp39-cp39-manylinux_2_28_x86_64.whl (346.3 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.28+ x86-64

ducer-1.2.0-cp39-cp39-manylinux_2_28_aarch64.whl (327.7 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.28+ ARM64

ducer-1.2.0-cp39-cp39-macosx_11_0_arm64.whl (313.9 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

ducer-1.2.0-cp39-cp39-macosx_10_12_x86_64.whl (337.9 kB view details)

Uploaded CPython 3.9macOS 10.12+ x86-64

File details

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

File metadata

  • Download URL: ducer-1.2.0.tar.gz
  • Upload date:
  • Size: 39.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ducer-1.2.0.tar.gz
Algorithm Hash digest
SHA256 22e06cc1cb71597ea7eda575710c38eec70407e42e86557040dc70b13ddce09f
MD5 68adc3fa148b5d5f1fbb8dcca45c0fef
BLAKE2b-256 64acf42d716f01849e7183df699ddbb3a3856711943d05359542933d6f669739

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0.tar.gz:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ducer-1.2.0-cp314-cp314-win_arm64.whl.

File metadata

  • Download URL: ducer-1.2.0-cp314-cp314-win_arm64.whl
  • Upload date:
  • Size: 262.4 kB
  • Tags: CPython 3.14, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ducer-1.2.0-cp314-cp314-win_arm64.whl
Algorithm Hash digest
SHA256 3b9e821ed87367059f7773b79f28d0e227b936fd54236e9821fa91e9ef6e5f97
MD5 b9e9467f583faf027d21278f6a4b03a6
BLAKE2b-256 c7852d13ace31a01bb7de97b0978948f9f1fa6cfda24b3caa1c39b2df1a76ac8

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp314-cp314-win_arm64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ducer-1.2.0-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: ducer-1.2.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 285.3 kB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ducer-1.2.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 50ae7c564e72196612879bf9c84762ead92cb768e218cb1b300de18fced532fa
MD5 89b7e49f4051ffcc3a164aea24825c0e
BLAKE2b-256 59c81f246be0bf3b7bffcec062c6cf6138e65ff482bc7051615e1b4575c484e1

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp314-cp314-win_amd64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ducer-1.2.0-cp314-cp314-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ducer-1.2.0-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2a44121c7e7d959633ab4151a5de25d4d73cb368c079794ba737a8053f99d533
MD5 01781b52fb01b2b6f67f352f57a11208
BLAKE2b-256 d3f1b00b6393b287355a4971fabfe8c269a72a5d0a9815c7b4095a71dddd3092

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp314-cp314-manylinux_2_28_x86_64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ducer-1.2.0-cp314-cp314-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for ducer-1.2.0-cp314-cp314-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 7bf306fccd6b742d2bda623e0288ef469c99291f8405ac61b5f8549614a22dbd
MD5 3f4710ce8057507e8ed202fbd6f9c978
BLAKE2b-256 99e0e054f54b45876ff36c11c1c3df8c6b9941049447d6cb0a9d8ca5e2098780

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp314-cp314-manylinux_2_28_aarch64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ducer-1.2.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ducer-1.2.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8b7aa81dd8c4a1f1e341cbb01bca2823d6b9065b4328a01098b8638cb98323fa
MD5 6a112a613817e1671dd9d43ca5b01f77
BLAKE2b-256 69c0107216e1349b132a740c4123c6da5f8cff57ace9e70cbc5ff9e89a4fd3d7

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp314-cp314-macosx_11_0_arm64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ducer-1.2.0-cp314-cp314-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for ducer-1.2.0-cp314-cp314-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 abfe1908f99178f99334f8c7c55e82d2b221cda08615537a75d65df480c7544e
MD5 a0a506e3aa99a4286588b24043240435
BLAKE2b-256 ef684ebb1a468ec07f8449d87b209bda9de4da6b8ab48925c75522ffa1559245

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp314-cp314-macosx_10_13_x86_64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ducer-1.2.0-cp313-cp313-win_arm64.whl.

File metadata

  • Download URL: ducer-1.2.0-cp313-cp313-win_arm64.whl
  • Upload date:
  • Size: 253.3 kB
  • Tags: CPython 3.13, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ducer-1.2.0-cp313-cp313-win_arm64.whl
Algorithm Hash digest
SHA256 05192ba789313931a1cac6c9250c914d186a9161efd3475d73872a4aeecc4942
MD5 41a3e4aadde1f4d592f6a115770504ff
BLAKE2b-256 0ef803d774bb370740e3173dd09795f5d713ccfd95e1e811bb78cd36638da24f

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp313-cp313-win_arm64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

  • Download URL: ducer-1.2.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 275.0 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ducer-1.2.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 7a054e87fca4466fa33610e2f194ebe49e36f1b743b3d1a2a2b1b076eae6e198
MD5 08d04058e4c9db686ef6aa1a0d209055
BLAKE2b-256 7b4ae23eeb2037d97538aa7b0eae44b78978cbc6db405d7b574ea26e9a277bb5

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp313-cp313-win_amd64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ducer-1.2.0-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ducer-1.2.0-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 68d9c32c789250f903a5303cba40e18f38356808b43215a701332801a1c44008
MD5 277d194fd941ec002f19c0e5dd064831
BLAKE2b-256 1d2ddb688610c2cfd588ce1c18b82b14bb32d952021ad7bc6ac07dd73c2fd3ba

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp313-cp313-manylinux_2_28_x86_64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ducer-1.2.0-cp313-cp313-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for ducer-1.2.0-cp313-cp313-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 3897ee4987280e78f74a45614318a5c17bc813289c365e0e63f39b3d6acc2075
MD5 0a048f22d9f40020774f1a8f6b2808bd
BLAKE2b-256 66766dff6c704670027a0c8c96181ae0799d46fb87b204a9f07df241c368fed2

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp313-cp313-manylinux_2_28_aarch64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

File hashes

Hashes for ducer-1.2.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 699fe5433489f660c4aca5df4dd3f6d689f1c7facf6254409e695e1f6f7a9a94
MD5 0b962265fc85db749ae891b299b84a9b
BLAKE2b-256 54b6b7acb0f124158025930e2e1264e6937845a74801808306ccda0a7589af19

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

File hashes

Hashes for ducer-1.2.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 a05e55b4c6686aefd1761af410d7bcc0d7d896f0662db8c7e38d1f91302b3416
MD5 1357fdeb222af1fa6f7e521b828b02f3
BLAKE2b-256 2e027f6a9ec796950d5227bc2102b1aacbba8f84bb5b8e14fcece62b927a5f47

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp313-cp313-macosx_10_13_x86_64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ducer-1.2.0-cp312-cp312-win_arm64.whl.

File metadata

  • Download URL: ducer-1.2.0-cp312-cp312-win_arm64.whl
  • Upload date:
  • Size: 253.4 kB
  • Tags: CPython 3.12, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ducer-1.2.0-cp312-cp312-win_arm64.whl
Algorithm Hash digest
SHA256 981d6d95524210387a05be64c8e8507f879547631de8ac9d35327550f6b271a1
MD5 42628c5f82f4708c4d95adb2ec366561
BLAKE2b-256 6a73a4c1fb9ea2d69fd32c2eb766ae9ee760be9f22fc67a1a4783427b439bf63

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp312-cp312-win_arm64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

  • Download URL: ducer-1.2.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 275.1 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ducer-1.2.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 3fd1050eb97fb2164c78e6235eac468b4cdb59b0dcc266dfee506554be2d62df
MD5 eff7317f77286df80a62ec28d2173188
BLAKE2b-256 3cc7f8d0b421d5b6f1d6b474bc4f27aecdd5e86ae416ba358cabd2389343247c

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp312-cp312-win_amd64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ducer-1.2.0-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ducer-1.2.0-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a327a3d9804eecbc57fed64fbffa359561b991c4db477daab8c6c62edd280e40
MD5 2e166aa19b798164f33fc69ec7b7c277
BLAKE2b-256 a5479bdb00ea6bd7b6b2567e64899711c0a63b30401234bf6a2f5f2c60912201

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp312-cp312-manylinux_2_28_x86_64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ducer-1.2.0-cp312-cp312-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for ducer-1.2.0-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 212334be7f1de2b8543c9893577c4db80c86ec5b098103482e5071dda8b98cb5
MD5 0463ef085ed5b70256e39b56d62b1ec6
BLAKE2b-256 756c67ae19e4970e9e1486ca79249810a2a24f4ed9dddc39735a9da38bd4d81d

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp312-cp312-manylinux_2_28_aarch64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

File hashes

Hashes for ducer-1.2.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5e9da5cbd0dac96cc4937a03a2c0c20ecaafa97b851e6653555a17e0a0ed583e
MD5 b2cee94842201e1f702dd8ffd4af2c49
BLAKE2b-256 add1275ad0e616ff3fb5045fbac3c418c367323126107518b7219ddabba99d46

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ducer-1.2.0-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for ducer-1.2.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 3e8d9e241099e50c0ad96f765303bfe09ca4ebf62d531a5935c19c69dbb80540
MD5 5256a278142fdde2b285241e3f7c00b2
BLAKE2b-256 238bef0754a7e21500c28b18ab6fa39c66180888ae739fdd4f7f25bf6a088dd2

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp312-cp312-macosx_10_13_x86_64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ducer-1.2.0-cp311-cp311-win_arm64.whl.

File metadata

  • Download URL: ducer-1.2.0-cp311-cp311-win_arm64.whl
  • Upload date:
  • Size: 253.0 kB
  • Tags: CPython 3.11, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ducer-1.2.0-cp311-cp311-win_arm64.whl
Algorithm Hash digest
SHA256 2edec7acfbdf50009861f55244338674476deab11b8b1995d89735f9219451f8
MD5 a39ff0a0ccff0206648e0e6b08d80c02
BLAKE2b-256 0f118d029ece0531fdfd0bfd0540e00ce35bcb488399e703ba83293d3f52d36b

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp311-cp311-win_arm64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

  • Download URL: ducer-1.2.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 275.0 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ducer-1.2.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 46b12954f7182da5c3889118e36d1a911a7aef3ef36c9cd4dd73cde06621b324
MD5 4a7b0e33b94cdf3564ca0ec681645c1e
BLAKE2b-256 77367229bfac4d186814cc0c8a89c8683abfce9bdec9abec33d35e00403af496

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp311-cp311-win_amd64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ducer-1.2.0-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ducer-1.2.0-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6ffe5d00cfd5d9152e4a1336048dd8bdc851892b54fb73f7133a4010aae399a8
MD5 a74efb281587dfea789875c88e26f8f7
BLAKE2b-256 5e7dbc39fb950169860633daf427a63f1355aa472d80858b86d67e49ffa4a475

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp311-cp311-manylinux_2_28_x86_64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ducer-1.2.0-cp311-cp311-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for ducer-1.2.0-cp311-cp311-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c1bb106fc3431a11a6578412eb5fb8b22569f93c62037f27029af99a301aeb97
MD5 805b0aea7d8c03acbf9e65866b91daa0
BLAKE2b-256 cd3f5944a533acff2856db1bb4c2a333c4e03c921d99698073c8902337fe4c0e

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp311-cp311-manylinux_2_28_aarch64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

File hashes

Hashes for ducer-1.2.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2be7a7108c75f47ad38fa7659ea8d07ff7535e8313c0edfef00fff3956c28e7e
MD5 f1c05721f04eb2a4d7ac429e8a3a9cd4
BLAKE2b-256 d3e68a9fd08dc4b48490067786f4d875b1791b65a7a58bd110a4cb0203223329

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ducer-1.2.0-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for ducer-1.2.0-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 7686c39cb066a62e13762888bb6b58f871beb9583970794696a83d08a1da2bc1
MD5 3cf576370dc06aa47402ac1f63108995
BLAKE2b-256 f39d8b41f7a968d85da34191e7f39aaf769b3e1b172d7426d35f9e78c3743052

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp311-cp311-macosx_10_12_x86_64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ducer-1.2.0-cp310-cp310-win_arm64.whl.

File metadata

  • Download URL: ducer-1.2.0-cp310-cp310-win_arm64.whl
  • Upload date:
  • Size: 253.2 kB
  • Tags: CPython 3.10, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ducer-1.2.0-cp310-cp310-win_arm64.whl
Algorithm Hash digest
SHA256 ceffda62178a742d72fff5e84339df831314d924c29e98d8655f2c8fca66d98b
MD5 d76ae4bee173689fb03ef7eac4b3d4fc
BLAKE2b-256 bac0fc80216911a56dcdf9977df769e5e3c01b609a7e3e04a7b671fa4e58d6e8

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp310-cp310-win_arm64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

  • Download URL: ducer-1.2.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 275.2 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ducer-1.2.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 dfbf580f9e62d5c4fa260341481931b21a767918d44b3026c12fb20709b9d285
MD5 9cf3bbbfa2ff8b56229c19e23fd1ed48
BLAKE2b-256 1c6862beb60444efd7b439831459fd6961ffda2713c828b7334d9fc773c775e2

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp310-cp310-win_amd64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ducer-1.2.0-cp310-cp310-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ducer-1.2.0-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7fa3a387ed536ce7d8bf7df3ef6bed5c285d423e048736f08dceb89586a58da4
MD5 0554abfd5777f390779a7f4a155fe2d2
BLAKE2b-256 4c7fd9c5e6187ffee1544111fc8decf1a5fec57881386345ea32a471b4778a24

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp310-cp310-manylinux_2_28_x86_64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ducer-1.2.0-cp310-cp310-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for ducer-1.2.0-cp310-cp310-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 3e9d606f30e91272c48d9040512c5c02b7088a613fb597a203be7f66795a4e1e
MD5 f0cc5328514cef28b0218b07b4174ab9
BLAKE2b-256 6ea3fb636cd77f18dd8c557b2d7991f1174a95c9b91d1f3fc585981c9661cb11

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp310-cp310-manylinux_2_28_aarch64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

File hashes

Hashes for ducer-1.2.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5623fe08c0a5641cb78798fd0dfd6243ce0866c887af00b53a5a0ee5be190d58
MD5 4ee338f4c8b47f543c19237b0f0ed322
BLAKE2b-256 34e1f23126541068aad9b219d89cc1bd9550b7930f8abcf74db3a54cc7c4817d

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ducer-1.2.0-cp310-cp310-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for ducer-1.2.0-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 65b101b19d6dad6aa86120b4852616b884e7ea22282947745a2f241ca863ddd8
MD5 bec90f5bddfccd2c02324f04a077126c
BLAKE2b-256 7c59437ee568eb0e15adc1abed08ce6aea8a7341e35c665b5a44612754559f6f

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp310-cp310-macosx_10_12_x86_64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ducer-1.2.0-cp39-cp39-win_arm64.whl.

File metadata

  • Download URL: ducer-1.2.0-cp39-cp39-win_arm64.whl
  • Upload date:
  • Size: 255.2 kB
  • Tags: CPython 3.9, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ducer-1.2.0-cp39-cp39-win_arm64.whl
Algorithm Hash digest
SHA256 795120edab75f167dc2a0a44e9dd1a30de81c6709ab90f237db999795a9f0b64
MD5 80bc586203cd039fe84d61971130d3b1
BLAKE2b-256 f74f8b3ca60ad1a99f3bf6e483a6bf422cbbfd5f212ffd7e05521f78d459c6d6

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp39-cp39-win_arm64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

  • Download URL: ducer-1.2.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 277.2 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ducer-1.2.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 4222a652e8d400ba12e881f18131688d7019b24cf6d1373bd822863138e38c45
MD5 ad6c63bb791f14155d23ef8a0e81f540
BLAKE2b-256 3c573cee8623f7c28c7a5565cfef52bcb477b623f495c35a7df40e2ea305a475

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp39-cp39-win_amd64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ducer-1.2.0-cp39-cp39-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ducer-1.2.0-cp39-cp39-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c7e1b9f67eca6218e113ad90e25d465a5ac8f4978a9cdb9d56aa627993343a41
MD5 5f8971bfb2da6856456aa73a6891c264
BLAKE2b-256 c8bca90713f523bea327fe34a73cd0736218b4cc80dd51efe1b7e19c41603de3

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp39-cp39-manylinux_2_28_x86_64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ducer-1.2.0-cp39-cp39-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for ducer-1.2.0-cp39-cp39-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6fe467e25b5135fcfa69ba4e75757c052397d7803d0eca20b662b175138d2b7e
MD5 f9c02e72a4318cf84417f0a12dc54d1b
BLAKE2b-256 0cf3ef693af704fd40caca491c88b3d2c81a9bee01f8dbae096a5f00142a7278

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp39-cp39-manylinux_2_28_aarch64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

  • Download URL: ducer-1.2.0-cp39-cp39-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 313.9 kB
  • Tags: CPython 3.9, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ducer-1.2.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9755d80cb30f91def6ec0dbefd948bfdcce0a5d05074aac908ad08d48bbb3897
MD5 3731e70291bcd46343c3e1f554dfaf9d
BLAKE2b-256 b2c9ba70c702a3ec62863b4df47a71c6fe0e707b7225eaa1f13a37576da3ccce

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp39-cp39-macosx_11_0_arm64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ducer-1.2.0-cp39-cp39-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for ducer-1.2.0-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 be5c0778c1be20354114798c8516cdb3b88c433dbc029a1d151b518ec5db6b6a
MD5 9fd864b6c0b7b643aecd416666082eb6
BLAKE2b-256 1532ab5b0732328c6c05e807cb91571bceba0d2ea2e85a0cff08ed382c346b68

See more details on using hashes here.

Provenance

The following attestation bundles were made for ducer-1.2.0-cp39-cp39-macosx_10_12_x86_64.whl:

Publisher: build_wheels.yml on jfolz/ducer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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