Smaller & Faster Single-File Vector Search Engine from Unum
Project description
USearch
Smaller & Faster Single-File
Vector Search Engine
Euclidean • Angular • Jaccard • Hamming • Haversine • User-Defined Metrics
C++11 •
Python •
JavaScript •
Java •
Rust •
Objective-C •
Swift •
GoLang •
Wolfram
Linux • MacOS • Windows
- Industry-leading performance.
- Easily-extendible single C++11 header implementation.
- User-defined and pre-packaged SIMD-accelerated metrics.
- Half-precision
f16
and Quarter-precisionf8
support on any hardware. - View from disk, without loading into RAM.
- 4B+ sized space efficient point-clouds with
uint40_t
. - Variable dimensionality vectors - for obscure use-cases.
- Bring your threads, like OpenMP.
- Multiple vectors per label.
- Thread-safe
reserve
. - AI + Vector Search = Semantic Search.
FAISS | USearch | |
---|---|---|
Implementation | 84 K SLOC in faiss/ |
1 K SLOC in usearch/ |
Supported metrics | 9 fixed metrics | Any User-Defined metrics |
Supported ID types | uint32_t , uint64_t |
uint32_t , uint40_t , uint64_t |
Dependencies | BLAS, OpenMP | None |
Bindings | SWIG | Native |
Acceleration | Learned Quantization | Downcasting |
FAISS is the industry standard for a high-performance batteries-included vector search engine. Both USearch and FAISS implement the same HNSW algorithm. But they differ in a lot of design decisions. USearch is designed to be compact and broadly compatible without sacrificing performance.
FAISS, f32 |
USearch, f32 |
USearch, f16 |
USearch, f8 |
|
---|---|---|---|---|
Insertions | 76 K/s | 105 K/s | 115 K/s | 202 K/s |
Queries | 118 K/s | 174 K/s | 173 K/s | 304 K/s |
Recall @1 | 99% | 99.2% | 99.1% | 99.2% |
Dataset: 1M vectors sample of the Deep1B dataset. Hardware:
c7g.metal
AWS instance with 64 cores and DDR5 memory. HNSW was configured with identical hyper-parameters: connectivityM=16
, expansion @ constructionefConstruction=128
, and expansion @ searchef=64
. Both libraries were compiled for the target architecture. Jump to the Performance Tuning section to read about the effects of those hyper-parameters.
User-Defined Functions
Most vector-search packages focus on just 2 metrics - "Inner Product distance" and "Euclidean distance". That only partially exhausts the list of possible metrics. A good example would be the rare Haversine distance, used to compute the distance between geo-spatial coordinates, extending Vector Search into the GIS domain. Another example would be designing a custom metric for composite embeddings concatenated from multiple AI models in real-world applications. USearch supports that: Python and C++ examples.
Unlike older approaches indexing high-dimensional spaces, like KD-Trees and Locality Sensitive Hashing, HNSW doesn't require vectors to be identical in length. They only have to be comparable. So you can apply it in obscure applications, like searching for similar sets or fuzzy text matching.
Memory Efficiency, Downcasting, and Quantization
Training a quantization model and dimension-reduction is a common approach to accelerate vector search. Those, however, are only sometimes reliable, can significantly affect the statistical properties of your data, and require regular adjustments if your distribution shifts.
Instead, we have focused on high-precision arithmetic over low-precision downcasted vectors.
The same index, and add
and search
operations will automatically down-cast or up-cast between f32_t
, f16_t
, f64_t
, and f8_t
representations, even if the hardware doesn't natively support it.
Continuing the topic of memory-efficiency, we provide a uint40_t
to allow collection with over 4B+ vectors without allocating 8 bytes for every neighbor reference in the proximity graph.
View Larger Indexes from Disk
Modern search systems often suggest using different servers to maximize indexing speed and minimize serving costs. Memory-optimized for the first task, and storage-optimized for the second, if the index can be served from external memory, which USearch can.
To Build | To Serve | |
---|---|---|
Instance | u-24tb1.metal | is4gen.8xlarge |
Price | ~ $200/h | ~$4.5/h |
Memory | 24 TB RAM + EBS | 192 GB RAM + 30 TB SSD |
There is a 50x difference between the cost of such instances for identical capacity. Of course, the latency of external memory access will be higher, but it is in part compensated with an excellent prefetching mechanism.
Usage
There are two usage patters:
- Bare-bones with
usearch/usearch.hpp
, only available in C++. - Full-fat version with it's own threads, mutexes, type-punning, quantization, that is available both in C++ and is wrapped for higher-level bindings.
C++
Installation
To use in a C++ project simply copy the include/usearch/usearch.hpp
header into your project.
Alternatively fetch it with CMake:
FetchContent_Declare(usearch GIT_REPOSITORY https://github.com/unum-cloud/usearch.git)
FetchContent_MakeAvailable(usearch)
Quickstart
Once included, the low-level C++11 interface is as simple as it gets: reserve()
, add()
, search()
, size()
, capacity()
, save()
, load()
, view()
.
This covers 90% of use-cases.
using namespace unum::usearch;
index_gt<cos_gt<float>> index;
float vec[3] = {0.1, 0.3, 0.2};
index.reserve(10);
index.add(/* label: */ 42, /* vector: */ {&vec[0], 3});
auto results = index.search(/* query: */ {&vec[0], 3}, 5 /* neighbors */);
for (std::size_t i = 0; i != results.size(); ++i)
results[i].member.label, results[i].member.vector, results[i].distance;
The add
is thread-safe for concurrent index construction.
Serialization
index.save("index.usearch");
index.load("index.usearch"); // Copying from disk
index.view("index.usearch"); // Memory-mapping from disk
User-Defined Metrics in C++
For advanced users, more compile-time abstractions are available.
template <typename metric_at = ip_gt<float>, //
typename label_at = std::size_t, // `uint32_t`, `uuid_t`...
typename id_at = std::uint32_t, // `uint40_t`, `uint64_t`...
typename scalar_at = float, // `double`, `half`, `char`...
typename allocator_at = std::allocator<char>> //
class index_gt;
You may want to use a custom memory allocator or a rare scalar type, but most often, you would start by defining a custom similarity measure. The function object should have the following signature to support different-length vectors.
struct custom_metric_t {
T operator()(T const* a, T const* b, std::size_t a_length, std::size_t b_length) const;
};
The following distances are pre-packaged:
cos_gt<scalar_t>
for "Cosine" or "Angular" distance.ip_gt<scalar_t>
for "Inner Product" or "Dot Product" distance.l2sq_gt<scalar_t>
for the squared "L2" or "Euclidean" distance.jaccard_gt<scalar_t>
for "Jaccard" distance between two ordered sets of unique elements.bitwise_hamming_gt<scalar_t>
for "Hamming" distance, as the number of shared bits in hashes.bitwise_tanimoto_gt<scalar_t>
for "Tanimoto" coefficient for bit-strings.bitwise_sorensen_gt<scalar_t>
for "Dice-Sorensen" coefficient for bit-strings.pearson_correlation_gt<scalar_t>
for "Pearson" correlation between probability distributions.haversine_gt<scalar_t>
for "Haversine" or "Great Circle" distance between coordinates used in GIS applications.
Multi-Threading
Most AI, HPC, or Big Data packages use some form of a thread pool.
Instead of spawning additional threads within USearch, we focus on the thread safety of add()
function, simplifying resource management.
#pragma omp parallel for
for (std::size_t i = 0; i < n; ++i)
native.add(label, span_t{vector, dims}, add_config_t { .thread = omp_get_thread_num() });
During initialization, we allocate enough temporary memory for all the cores on the machine. On the call, the user can supply the identifier of the current thread, making this library easy to integrate with OpenMP and similar tools.
Python
Installation
pip install usearch
Quickstart
import numpy as np
from usearch.index import Index
index = Index(
ndim=3, # Define the number of dimensions in input vectors
metric='cos', # Choose 'l2sq', 'haversine' or other metric, default = 'ip'
dtype='f32', # Quantize to 'f16' or 'f8' if needed, default = 'f32'
connectivity=16, # How frequent should the connections in the graph be, optional
expansion_add=128, # Control the recall of indexing, optional
expansion_search=64, # Control the quality of search, optional
)
vector = np.array([0.2, 0.6, 0.4], dtype=np.float32)
index.add(42, vector)
matches, distances, count = index.search(vector, 10)
assert len(index) == 1
assert count == 1
assert matches[0] == 42
assert distances[0] <= 0.001
Python bindings are implemented with pybind/pybind11
.
Assuming the presence of Global Interpreter Lock in Python, we spawn threads in the C++ layer on large insertions.
Serialization
index.save('index.usearch')
index.load('index.usearch') # Copy the whole index into memory
index.view('index.usearch') # View from disk without loading in memory
Batch Operations
Adding or querying a batch of entries is identical to adding a single vector. The difference would be in the shape of the tensors.
n = 100
labels = np.array(range(n), dtype=np.longlong)
vectors = np.random.uniform(0, 0.3, (n, index.ndim)).astype(np.float32)
index.add(labels, vectors, threads=..., copy=...)
matches, distances, counts = index.search(vectors, 10, threads=...)
assert matches.shape[0] == vectors.shape[0]
assert counts[0] <= 10
You can also override the default threads
and copy
arguments in bulk workloads.
The first controls the number of threads spawned for the task.
The second controls whether the vector itself will be persisted inside the index.
If you can preserve the lifetime of the vector somewhere else, you can avoid the copy.
User-Defined Metrics in Python
Assuming the language boundary exists between Python user code and C++ implementation, there are more efficient solutions than passing a Python callable to the engine. Luckily, with the help of Numba, we can JIT compile a function with a matching signature and pass it down to the engine.
from numba import cfunc, types, carray
signature = types.float32(
types.CPointer(types.float32),
types.CPointer(types.float32),
types.uint64, types.uint64)
@cfunc(signature)
def python_dot(a, b, n, m):
a_array = carray(a, n)
b_array = carray(b, n)
c = 0.0
for i in range(n):
c += a_array[i] * b_array[i]
return c
index = Index(ndim=ndim, metric=python_dot.address)
To use Numba JIT, install USearch with extras:
pip install usearch[jit]
Tooling
from usearch.index import Index
from usearch.io import load_matrix, save_matrix
vectors = load_matrix('deep1B.fbin')
index = Index(ndim=vectors.shape[1])
index.add(labels, vectors)
JavaScript
Installation
npm install usearch
Quickstart
var index = new usearch.Index({ metric: 'cos', connectivity: 16, dimensions: 3 })
index.add(42, new Float32Array([0.2, 0.6, 0.4]))
var results = index.search(new Float32Array([0.2, 0.6, 0.4]), 10)
assert.equal(index.size(), 1)
assert.deepEqual(results.labels, new Uint32Array([42]))
assert.deepEqual(results.distances, new Float32Array([0]))
Serialization
index.save('index.usearch')
index.load('index.usearch')
index.view('index.usearch')
Rust
Installation
cargo add usearch
Quickstart
let quant: &str = "f16";
let index = new_ip(3, &quant, 0, 0, 0).unwrap();
assert!(index.reserve(10).is_ok());
assert!(index.capacity() >= 10);
assert!(index.connectivity() != 0);
assert_eq!(index.dimensions(), 3);
assert_eq!(index.size(), 0);
let first: [f32; 3] = [0.2, 0.1, 0.2];
let second: [f32; 3] = [0.2, 0.1, 0.2];
assert!(index.add(42, &first).is_ok());
assert!(index.add(43, &second).is_ok());
assert_eq!(index.size(), 2);
// Read back the tags
let results = index.search(&first, 10).unwrap();
assert_eq!(results.count, 2);
Multi-Threading
assert!(index.add_in_thread(42, &first, 0).is_ok());
assert!(index.add_in_thread(43, &second, 0).is_ok());
let results = index.search_in_thread(&first, 10, 0).unwrap();
Being a systems-programming language, Rust has better control over memory management and concurrency but lacks function overloading.
Aside from the add
and search
, USearch Rust binding also provides add_in_thread
and search_in_thread
, which let users identify the calling thread to use underlying temporary memory more efficiently.
Serialization
assert!(index.save("index.usearch").is_ok());
assert!(index.load("index.usearch").is_ok());
assert!(index.view("index.usearch").is_ok());
Metrics
assert!(new_l2sq(3, &quant, 0, 0, 0).is_ok());
assert!(new_cos(3, &quant, 0, 0, 0).is_ok());
assert!(new_haversine(&quant, 0, 0, 0).is_ok());
Java
Installation
<dependency>
<groupId>cloud.unum</groupId>
<artifactId>usearch</artifactId>
<version>0.2.3</version>
</dependency>
Add that snippet to your pom.xml
and hit mvn install
.
Quickstart
Index index = new Index.Config().metric("cos").dimensions(2).build();
float vec[] = {10, 20};
index.add(42, vec);
int[] labels = index.search(vec, 5);
Swift
Installation
https://github.com/unum-cloud/usearch
Quickstart
let index = Index.l2sq(dimensions: 3, connectivity: 8)
let vectorA: [Float32] = [0.3, 0.5, 1.2]
let vectorB: [Float32] = [0.4, 0.2, 1.2]
index.add(label: 42, vector: vectorA[...])
index.add(label: 43, vector: vectorB[...])
let results = index.search(vector: vectorA[...], count: 10)
assert(results.0[0] == 42)
GoLang
Installation
import (
"github.com/unum-cloud/usearch/golang"
)
Quickstart
package main
import (
"fmt"
"github.com/unum-cloud/usearch/golang"
)
func main() {
conf := usearch.DefaultConfig(128)
index := usearch.NewIndex(conf)
v := make([]float32, 128)
index.Add(42, v)
results := index.Search(v, 1)
}
Wolfram
TODO
- JavaScript: Allow calling from "worker threads".
- Rust: Allow passing a custom thread ID.
- C# .NET bindings.
AI + Vector Search = Semantic Search
AI has a growing number of applications, but one of the coolest classic ideas is to use it for Semantic Search. One can take an encoder model, like the multi-modal UForm, and a web-programming framework, like UCall, and build an image search platform in just 20 lines of Python.
import ucall.rich_posix as ucall
import uform
from usearch.index import Index
import numpy as np
from PIL import Image
server = ucall.Server()
model = uform.get_model('unum-cloud/uform-vl-multilingual')
index = Index(ndim=256)
@server
def add(label: int, photo: Image.Image):
image = model.preprocess_image(photo)
vector = model.encode_image(image).detach().numpy()
index.add(label, vector.flatten(), copy=True)
@server
def search(query: str) -> np.ndarray:
tokens = model.preprocess_text(query)
vector = model.encode_text(tokens).detach().numpy()
neighbors, _, _ = index.search(vector.flatten(), 3)
return neighbors
server.run()
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
File details
Details for the file usearch-0.12.2-cp311-cp311-win_amd64.whl
.
File metadata
- Download URL: usearch-0.12.2-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 157.2 kB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3032a5dc28128a15880461205e71635f349a85e16507649f754914b6d19c326c |
|
MD5 | d6a76925f777558cf6d9538753bff2f3 |
|
BLAKE2b-256 | 2ddf4923711d67dd60831fae25198e5da1d08470b913473574952266037ee9a7 |
File details
Details for the file usearch-0.12.2-cp311-cp311-manylinux_2_28_x86_64.whl
.
File metadata
- Download URL: usearch-0.12.2-cp311-cp311-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 314.9 kB
- Tags: CPython 3.11, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | fde4a371daa5baf12e42341d651940ff7c929ba4fe63c7b501695047f59a5b9c |
|
MD5 | 8ef35d3081af941a031385e714f32521 |
|
BLAKE2b-256 | 50ae8b9739f3e5fe60f74104f2cff3fafaa15d8843f7d55fa60367494b564080 |
File details
Details for the file usearch-0.12.2-cp311-cp311-manylinux_2_28_aarch64.whl
.
File metadata
- Download URL: usearch-0.12.2-cp311-cp311-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 303.9 kB
- Tags: CPython 3.11, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4dfcae4eacd8f5a7c06d1b183f75c2e5674235f6023a92a55f2517d5cf74c74c |
|
MD5 | 3675d77843f033e7b56cac210ac8b765 |
|
BLAKE2b-256 | 80f347e27620dd025f59d449d50fff76206ab7094c81d2b854fa4d1f0ca44746 |
File details
Details for the file usearch-0.12.2-cp311-cp311-macosx_11_0_arm64.whl
.
File metadata
- Download URL: usearch-0.12.2-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 196.9 kB
- Tags: CPython 3.11, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7731458a3c86f6393b55af512552c750dd1f1dd95fc64994f8a3529586e5252d |
|
MD5 | fc0b84c9557f32cbc3dc958d41475b33 |
|
BLAKE2b-256 | 599010023c13a69de2da499cd31777c78f30aa116cc00dc11ccc74e1d1c7a1e0 |
File details
Details for the file usearch-0.12.2-cp311-cp311-macosx_10_9_x86_64.whl
.
File metadata
- Download URL: usearch-0.12.2-cp311-cp311-macosx_10_9_x86_64.whl
- Upload date:
- Size: 210.2 kB
- Tags: CPython 3.11, macOS 10.9+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | b791d23cec6941ec1205b658315d5606b114f7652cb812df329e5594e922970a |
|
MD5 | 682f8136548ef6afbeb1a0f45e110c81 |
|
BLAKE2b-256 | f0d5b347a78b7354e9ce09b71caa368dca8341a2cfe3135ef892918e81954307 |
File details
Details for the file usearch-0.12.2-cp311-cp311-macosx_10_9_universal2.whl
.
File metadata
- Download URL: usearch-0.12.2-cp311-cp311-macosx_10_9_universal2.whl
- Upload date:
- Size: 387.2 kB
- Tags: CPython 3.11, macOS 10.9+ universal2 (ARM64, x86-64)
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | a2b507d0dc56c83da09787912ade7a15f0d7648c13639711c96ff259d8796c34 |
|
MD5 | a928330e56610c5b4c3712e83efe9e01 |
|
BLAKE2b-256 | efeedcf5622baaa5eda6de12cfe4db2d1d88ece1160968ba64a0ef52c93969b7 |
File details
Details for the file usearch-0.12.2-cp310-cp310-win_amd64.whl
.
File metadata
- Download URL: usearch-0.12.2-cp310-cp310-win_amd64.whl
- Upload date:
- Size: 157.2 kB
- Tags: CPython 3.10, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4af643ab96d61e689b9d4a1d28a60b1f0db184088abfd24c62ab8735a8f2f1ef |
|
MD5 | 9e4a75a798dd6a426ba5446a3ae5d11d |
|
BLAKE2b-256 | d4bc2d4acdf39d10a770a1604a1caad3cd084a9ff70ab28dc021fdde7b5d7557 |
File details
Details for the file usearch-0.12.2-cp310-cp310-manylinux_2_28_x86_64.whl
.
File metadata
- Download URL: usearch-0.12.2-cp310-cp310-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 314.8 kB
- Tags: CPython 3.10, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | b5ea2d413b534d76374e4f34a00202c98d1d283e5e7498cb30280be15d887158 |
|
MD5 | 0da6a3f8591ebeae9ddf35c0b89c5cd2 |
|
BLAKE2b-256 | b120c20ba8fe39d1f6baf05a00104cf1bc0d8d3da384271e846c2a6b8dc5df06 |
File details
Details for the file usearch-0.12.2-cp310-cp310-manylinux_2_28_aarch64.whl
.
File metadata
- Download URL: usearch-0.12.2-cp310-cp310-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 304.0 kB
- Tags: CPython 3.10, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5a0c8ba50378dcd73c6913e6365a801c6e8d29b012f2c1749a0962f5662a6c9f |
|
MD5 | 6066cc4993f402bffcd6fa5476850e59 |
|
BLAKE2b-256 | aa495da8462a079611a5d13b7df069cae0b00dc1381b7dcf7ff9e9c031eb3a12 |
File details
Details for the file usearch-0.12.2-cp310-cp310-macosx_11_0_arm64.whl
.
File metadata
- Download URL: usearch-0.12.2-cp310-cp310-macosx_11_0_arm64.whl
- Upload date:
- Size: 196.9 kB
- Tags: CPython 3.10, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 791bc419c1a06bba4bcd0e24056bdd8bf69d69ed393bfe63e44f79b4089fa62b |
|
MD5 | ab5a1e7868594c6e09aeafcd836b5fa1 |
|
BLAKE2b-256 | f9026d48e5348991f3e1445488dfb7d16c4e2c74271980b88384c0ab0e8b7236 |
File details
Details for the file usearch-0.12.2-cp310-cp310-macosx_10_9_x86_64.whl
.
File metadata
- Download URL: usearch-0.12.2-cp310-cp310-macosx_10_9_x86_64.whl
- Upload date:
- Size: 210.2 kB
- Tags: CPython 3.10, macOS 10.9+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 04e7d8e21291d887ab5253d2cc37f37e78ba0b67509f5f1d83910cac3985087b |
|
MD5 | 23dd5cdfb756f72b14512292d9ed5c64 |
|
BLAKE2b-256 | 747f6cd56fc05c14030801106e47576ddab8de7371d21c7ee67d002b77a71cf7 |
File details
Details for the file usearch-0.12.2-cp310-cp310-macosx_10_9_universal2.whl
.
File metadata
- Download URL: usearch-0.12.2-cp310-cp310-macosx_10_9_universal2.whl
- Upload date:
- Size: 387.2 kB
- Tags: CPython 3.10, macOS 10.9+ universal2 (ARM64, x86-64)
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 709617f811d3a868458d3b26eceeb68eb38fe98bd8c04ee4b4bf4db3f59270dc |
|
MD5 | baea119f941c8a25e1a646205268c4c8 |
|
BLAKE2b-256 | 850338487c96be20e1a1eb4eba3204edd29413cfc1721be5922b1b64188ef062 |
File details
Details for the file usearch-0.12.2-cp39-cp39-win_amd64.whl
.
File metadata
- Download URL: usearch-0.12.2-cp39-cp39-win_amd64.whl
- Upload date:
- Size: 157.3 kB
- Tags: CPython 3.9, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 20a2c9c0656271665789d6774398e9bac934ff4f415a9d9978d561b23664c700 |
|
MD5 | 2f17c0501075de27ddd42cd6802b94e7 |
|
BLAKE2b-256 | f04a5e6ae0d0da25977e605b451f7445d537df97bccb54df8daea66cf960e3c1 |
File details
Details for the file usearch-0.12.2-cp39-cp39-manylinux_2_28_x86_64.whl
.
File metadata
- Download URL: usearch-0.12.2-cp39-cp39-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 314.6 kB
- Tags: CPython 3.9, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2e3284b09ad14531f37cfc2e89c49024be8d223cbb49f5ca5fb00a3460208ba7 |
|
MD5 | ba2df3e454903f251dc0ecf58481d68a |
|
BLAKE2b-256 | 04d7d617f02e88fdd578c8868805a920c9e1494e2e659f26971c866098e3264b |
File details
Details for the file usearch-0.12.2-cp39-cp39-manylinux_2_28_aarch64.whl
.
File metadata
- Download URL: usearch-0.12.2-cp39-cp39-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 303.9 kB
- Tags: CPython 3.9, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0e45c89f2fc62781f6ce5cfc39e16d524627181d0eacea4cde28a5e82ebeafff |
|
MD5 | e6db0a704cbbc721112f4479316041ed |
|
BLAKE2b-256 | eda70266e62f62df29df613d4c14a879626f350e4e3345e78b332dc338028583 |
File details
Details for the file usearch-0.12.2-cp39-cp39-macosx_11_0_arm64.whl
.
File metadata
- Download URL: usearch-0.12.2-cp39-cp39-macosx_11_0_arm64.whl
- Upload date:
- Size: 197.0 kB
- Tags: CPython 3.9, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 48c59be00ec1718f3273f6e283d42c262cf6ed8a84782fd2a13b40c707f209db |
|
MD5 | 6d77670579b42b471bda579bb725d3f0 |
|
BLAKE2b-256 | d908fcad4fd0559d6bcd555744613e1d307e938035eab3b079f1d40b574e903f |
File details
Details for the file usearch-0.12.2-cp39-cp39-macosx_10_9_x86_64.whl
.
File metadata
- Download URL: usearch-0.12.2-cp39-cp39-macosx_10_9_x86_64.whl
- Upload date:
- Size: 210.4 kB
- Tags: CPython 3.9, macOS 10.9+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 07a620250f025f9575187563bf788fa8d71b3707b792a59ddafaab7e0764ec4c |
|
MD5 | 813a5dfa369977b17160c1c664a83a42 |
|
BLAKE2b-256 | 051788b87aa8110b38450e19a4ab3e4f277197cc2fccacb819597f77fcfcc157 |
File details
Details for the file usearch-0.12.2-cp39-cp39-macosx_10_9_universal2.whl
.
File metadata
- Download URL: usearch-0.12.2-cp39-cp39-macosx_10_9_universal2.whl
- Upload date:
- Size: 387.5 kB
- Tags: CPython 3.9, macOS 10.9+ universal2 (ARM64, x86-64)
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2d03b11016f1588a3e7d6c9e7368b9263c18db3b37955ce21797766b4d8f53d7 |
|
MD5 | 0a0da114ea3ca3587c719ac6c42c96aa |
|
BLAKE2b-256 | aaa781f84a9d8409a48d799d103ee0309db3884adbfc702883f69da894c4a862 |
File details
Details for the file usearch-0.12.2-cp38-cp38-win_amd64.whl
.
File metadata
- Download URL: usearch-0.12.2-cp38-cp38-win_amd64.whl
- Upload date:
- Size: 157.0 kB
- Tags: CPython 3.8, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 40a80d1f24472ee3a0cf1edb0bd688ab485d8c8c13eae0b118ef059206ed067d |
|
MD5 | 97216c6a357510143f256056919618f5 |
|
BLAKE2b-256 | c03f41ffbfa401a0310a2577e77c43abcc199e9bfe2151b6088a959011f1941e |
File details
Details for the file usearch-0.12.2-cp38-cp38-manylinux_2_28_x86_64.whl
.
File metadata
- Download URL: usearch-0.12.2-cp38-cp38-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 314.3 kB
- Tags: CPython 3.8, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6703ba9424957be4ad5f579578e7f4fa085eac587dcce17de7bdc44d9c6f5d20 |
|
MD5 | a132fbe8abe1d5b4ec3e3d9c93c9078e |
|
BLAKE2b-256 | 78843027e3a05d1a56ca49f1021f571e4bdfcb8621de0e1a894a6417779cb296 |
File details
Details for the file usearch-0.12.2-cp38-cp38-manylinux_2_28_aarch64.whl
.
File metadata
- Download URL: usearch-0.12.2-cp38-cp38-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 303.7 kB
- Tags: CPython 3.8, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 659df55a01bfd20dd8dea30c1e4e9527b157914dc775d0337086461dfeb9a40d |
|
MD5 | 558f0f153371f239c3137f0727ea8733 |
|
BLAKE2b-256 | de10eab78de2b29c186044be4f3afae650b34128ce99062058db180aea9e57e5 |
File details
Details for the file usearch-0.12.2-cp38-cp38-macosx_11_0_arm64.whl
.
File metadata
- Download URL: usearch-0.12.2-cp38-cp38-macosx_11_0_arm64.whl
- Upload date:
- Size: 196.8 kB
- Tags: CPython 3.8, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | eaf89d603f535799998a0d4fe465ba97560f8adb826cb69559b7c41c2d996854 |
|
MD5 | 8a87c82a67e2fb9ce0d030699bd6c1be |
|
BLAKE2b-256 | 412be28018ba9987780b1f2f960f0d1e53ea6bef12378a0ea52b9e7e6792a5ef |
File details
Details for the file usearch-0.12.2-cp38-cp38-macosx_10_9_x86_64.whl
.
File metadata
- Download URL: usearch-0.12.2-cp38-cp38-macosx_10_9_x86_64.whl
- Upload date:
- Size: 210.2 kB
- Tags: CPython 3.8, macOS 10.9+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 028f99d7b73f2b1b0907454df3df03fbbb24d1bd90b07156604366e0e8a3143b |
|
MD5 | a6287cdcc69d4d576d5a10045bb0f9b1 |
|
BLAKE2b-256 | d7f27f9e1ee8ed4925819787ff64fee18f887c835dd480667a22a85b0d1e72b1 |
File details
Details for the file usearch-0.12.2-cp38-cp38-macosx_10_9_universal2.whl
.
File metadata
- Download URL: usearch-0.12.2-cp38-cp38-macosx_10_9_universal2.whl
- Upload date:
- Size: 387.1 kB
- Tags: CPython 3.8, macOS 10.9+ universal2 (ARM64, x86-64)
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | d6c11bc480e4cb6a0de484bcb9d527e45186ffc6da44a9e32e37f1ef635a3bdf |
|
MD5 | b343884d9c0f29e3dad3594184764693 |
|
BLAKE2b-256 | a4035acae7ea54f41b9dcaae54421fcd5c9de889b4d6d30ee9acc636df49ae3e |
File details
Details for the file usearch-0.12.2-cp37-cp37m-win_amd64.whl
.
File metadata
- Download URL: usearch-0.12.2-cp37-cp37m-win_amd64.whl
- Upload date:
- Size: 157.1 kB
- Tags: CPython 3.7m, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7f61e8f79568c95dff56b4b761eb7032f2fe40fa35ea95ebd5283c448ad49980 |
|
MD5 | fde0fbe7f2db15a43d3876e768dbf790 |
|
BLAKE2b-256 | ac827382ae4aea7ca076a6099f9d990fb3b1a0f855c56bd493723011b8128b9d |
File details
Details for the file usearch-0.12.2-cp37-cp37m-manylinux_2_28_x86_64.whl
.
File metadata
- Download URL: usearch-0.12.2-cp37-cp37m-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 318.2 kB
- Tags: CPython 3.7m, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 03832bcb0cab2109143747e95c12fb37dfb0cc1966f03492513ed1e486ef9c5a |
|
MD5 | f1a98ed9cbbc0bce2fe392e2fb2c911a |
|
BLAKE2b-256 | 2e563c044330da57499162374625f69e7a6731199902bce6304b5ceb9b915342 |
File details
Details for the file usearch-0.12.2-cp37-cp37m-manylinux_2_28_aarch64.whl
.
File metadata
- Download URL: usearch-0.12.2-cp37-cp37m-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 308.1 kB
- Tags: CPython 3.7m, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | c44a4d5f8dff5b7130c29ee089b89e534db69ebe285c4168cacd8bf65a701b7f |
|
MD5 | 608aca019243675e5f2c7bcff801e127 |
|
BLAKE2b-256 | a2d3471e752dde1cd5fa24d67cda3f0344147199e3095ab655feb669de65cb12 |
File details
Details for the file usearch-0.12.2-cp37-cp37m-macosx_10_9_x86_64.whl
.
File metadata
- Download URL: usearch-0.12.2-cp37-cp37m-macosx_10_9_x86_64.whl
- Upload date:
- Size: 207.8 kB
- Tags: CPython 3.7m, macOS 10.9+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7616ec7cffc4bfe3aa55b4bf162412ba09e798f1c4e3e4fc5fa1f2079af63661 |
|
MD5 | a7afcacb4986a03a408edb6123dc48d0 |
|
BLAKE2b-256 | 09d726ae95d484fac5017245c1fdf57f5197bf3c58375fb754945f5b0b39402c |
File details
Details for the file usearch-0.12.2-cp36-cp36m-win_amd64.whl
.
File metadata
- Download URL: usearch-0.12.2-cp36-cp36m-win_amd64.whl
- Upload date:
- Size: 157.0 kB
- Tags: CPython 3.6m, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9de8329cfa4fb9a2bd80a5dbf9f5264e4f7e40c488d3b94d331af2dfbc4d8321 |
|
MD5 | 2e0ad406407e8690666bf66c4af2bec0 |
|
BLAKE2b-256 | 97d3e86481b205d1949561a1dddcee5350bace5d5d5d426cf99b6e486dcfed83 |
File details
Details for the file usearch-0.12.2-cp36-cp36m-manylinux_2_28_x86_64.whl
.
File metadata
- Download URL: usearch-0.12.2-cp36-cp36m-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 318.1 kB
- Tags: CPython 3.6m, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 550b142dd587dd345ac52989bb72de834cdf1a024a7778beffac802136e04fac |
|
MD5 | afed2d1f92bdf4c0e520de895e454a7c |
|
BLAKE2b-256 | d88412687622aa1bd46a7ae91cbfaab53c8b78cbfe8f10c36d194dd32d3c64e9 |
File details
Details for the file usearch-0.12.2-cp36-cp36m-manylinux_2_28_aarch64.whl
.
File metadata
- Download URL: usearch-0.12.2-cp36-cp36m-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 308.2 kB
- Tags: CPython 3.6m, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | ca7e3ec2f39cc5c2c4984c1bb1e53135f58e5cbc243d5803bd8620ac1ddcb194 |
|
MD5 | 133308f2af939d0ee7f8351d1c0b2027 |
|
BLAKE2b-256 | b36486e9819d6905cf334190ea7e5a427a69fd0cb1a745e50dd60cde8d2ddfbb |
File details
Details for the file usearch-0.12.2-cp36-cp36m-macosx_10_9_x86_64.whl
.
File metadata
- Download URL: usearch-0.12.2-cp36-cp36m-macosx_10_9_x86_64.whl
- Upload date:
- Size: 207.9 kB
- Tags: CPython 3.6m, macOS 10.9+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4110e802ce9ca344358be66ba2cfc3017dd2fce34591f6a8010887fe6225cd84 |
|
MD5 | 9797d12f7721039b6a104214d5663e71 |
|
BLAKE2b-256 | d7b9c593f3bd7e77c991b813e1eaf0ad4fd3ed362c5da6e34a910325925aa431 |