A high-performance array storage and manipulation library
Project description
NumPack
A high-performance NumPy array storage library combining Rust's speed with Python's simplicity. Optimized for frequent read/write operations on large arrays, with built-in SIMD-accelerated vector similarity search.
Highlights
| Feature | Performance |
|---|---|
| Row Replacement | 344x faster than NPY |
| Data Append | 338x faster than NPY |
| Lazy Loading | 51x faster than NPY mmap |
| Full Load | 1.64x faster than NPY |
| Batch Mode | 21x speedup |
| Writable Batch | 92x speedup |
Core Capabilities:
- Zero-copy mmap operations with minimal memory footprint
- SIMD-accelerated Vector Engine (AVX2, AVX-512, NEON, SVE)
- Batch & Writable Batch modes for high-frequency modifications
- Supports all NumPy dtypes: bool, int8-64, uint8-64, float16/32/64, complex64/128
Installation
Python
pip install numpack
Requirements: Python ≥ 3.9, NumPy ≥ 1.26.0
Rust
Add to your Cargo.toml:
[dependencies]
numpack = "0.5.1"
ndarray = "0.16"
Features:
rayon(default) - Parallel processing supportavx512- AVX-512 SIMD optimizationsio-uring-support- io_uring on Linux
Requirements: Rust ≥ 1.70.0
Build from Source
# Prerequisites: Rust >= 1.70.0 (rustup.rs), C/C++ compiler
git clone https://github.com/BirchKwok/NumPack.git
cd NumPack
pip install maturin>=1.0,<2.0
maturin develop # or: maturin build --release
Basic Usage
use numpack::prelude::*;
use ndarray::{ArrayD, Array2, IxDyn};
use std::path::PathBuf;
fn main() -> NpkResult<()> {
// Create or open a NumPack storage
let io = ParallelIO::new(PathBuf::from("data.npk"))?;
// Save arrays with explicit dtype
let data = Array2::<f32>::from_shape_fn((1000, 128), |(r, c)| (r * 128 + c) as f32);
io.save_arrays(&[("embeddings".to_string(), data.into_dyn(), DataType::Float32)])?;
// Load array back (mmap-based, with automatic cache)
let loaded: ArrayD<f32> = io.load_array("embeddings")?;
assert_eq!(loaded.shape(), &[1000, 128]);
// In-place append (file append mode, no rewrite)
let extra = Array2::<f32>::ones((50, 128)).into_dyn();
io.append_rows("embeddings", &extra)?;
assert_eq!(io.get_shape("embeddings")?, vec![1050, 128]);
// Metadata is written on drop, or call sync_metadata() explicitly
io.sync_metadata()?;
Ok(())
}
API Reference
Storage Operations:
| Method | Description |
|---|---|
ParallelIO::new(path) |
Create or open a storage directory |
save_arrays(&[(name, array, dtype)]) |
Save one or more arrays (auto-parallel for large data) |
sync_metadata() |
Persist metadata to disk |
reset() |
Delete all arrays and metadata |
Read Operations (mmap-based):
| Method | Description |
|---|---|
load_array::<T>(name) |
Load full array via mmap with automatic cache |
getitem::<T>(name, &indexes) |
Read specific rows by index (supports negative indexing) |
read_rows(name, &indexes) |
Read specific rows as raw bytes |
stream_load::<T>(name, buffer_size) |
Streaming iterator yielding batches of rows |
get_array_view(name) |
Get a lazy array view (mmap-backed) |
Write Operations (in-place):
| Method | Description |
|---|---|
append_rows::<T>(name, &data) |
In-place append to existing array (file append mode) |
replace_rows::<T>(name, &data, &indices) |
In-place row replacement with pwrite |
clone_array(source, target) |
Deep copy an array to a new name |
Delete & Compact:
| Method | Description |
|---|---|
drop_arrays(name, Some(&indices)) |
Logical delete rows (bitmap-based) |
drop_arrays(name, None) |
Physical delete entire array |
compact_array(name) |
Remove logically deleted rows, reclaim space |
Metadata & Query:
| Method | Description |
|---|---|
has_array(name) |
Check if an array exists |
list_arrays() / get_member_list() |
List all array names |
get_array_metadata(name) |
Get array metadata (shape, dtype, size, etc.) |
get_shape(name) |
Get logical shape (accounts for deletions) |
get_modify_time(name) |
Get last modification timestamp (microseconds) |
Aliases (Python API compatible):
| Rust Method | Python Equivalent |
|---|---|
append_rows() |
NumPack.append() |
load_array() |
NumPack.load() |
getitem() |
NumPack.getitem() |
get_shape() |
NumPack.get_shape() |
get_modify_time() |
NumPack.get_modify_time() |
clone_array() |
NumPack.clone() |
get_member_list() |
NumPack.get_member_list() |
update() |
NumPack.update() |
stream_load() |
NumPack.stream_load() |
Array Operations:
use numpack::prelude::*;
use ndarray::Array2;
use std::path::PathBuf;
fn example() -> NpkResult<()> {
let io = ParallelIO::new(PathBuf::from("data.npk"))?;
// Save
let data = Array2::<f32>::zeros((1000, 128)).into_dyn();
io.save_arrays(&[("embeddings".to_string(), data, DataType::Float32)])?;
// In-place append (no file rewrite, O(new_data) complexity)
let extra = Array2::<f32>::ones((100, 128)).into_dyn();
io.append_rows("embeddings", &extra)?;
// Load full array (mmap with LRU cache, invalidated on write)
let arr: ndarray::ArrayD<f32> = io.load_array("embeddings")?;
assert_eq!(arr.shape(), &[1100, 128]);
// Random access by index (mmap, contiguous block detection)
let rows: ndarray::ArrayD<f32> = io.getitem("embeddings", &[0, 10, -1])?;
assert_eq!(rows.shape(), &[3, 128]);
// Replace rows in-place (pwrite, no file rewrite)
let new_rows = Array2::<f32>::from_elem((2, 128), 42.0).into_dyn();
io.replace_rows("embeddings", &new_rows, &[0, 1])?;
// Logical delete + compact
io.drop_arrays("embeddings", Some(&[5, 6, 7]))?;
io.compact_array("embeddings")?;
// Clone array
io.clone_array("embeddings", "embeddings_backup")?;
// Query
let shape = io.get_shape("embeddings")?;
let names = io.list_arrays();
let mtime = io.get_modify_time("embeddings");
// Delete entire array
io.drop_arrays("embeddings_backup", None)?;
io.sync_metadata()?;
Ok(())
}
Streaming Load:
// Process large arrays in batches without loading everything into memory
let iter: StreamIterator<f32> = io.stream_load("large_data", 10000)?;
for batch_result in iter {
let batch: ndarray::ArrayD<f32> = batch_result?;
// Process batch (up to 10000 rows each)
println!("Batch shape: {:?}", batch.shape());
}
Data Type Mapping:
| NumPack Type | Rust Type | Size |
|---|---|---|
DataType::Bool |
bool |
1 byte |
DataType::Int8 |
i8 |
1 byte |
DataType::Int16 |
i16 |
2 bytes |
DataType::Int32 |
i32 |
4 bytes |
DataType::Int64 |
i64 |
8 bytes |
DataType::Uint8 |
u8 |
1 byte |
DataType::Uint16 |
u16 |
2 bytes |
DataType::Uint32 |
u32 |
4 bytes |
DataType::Uint64 |
u64 |
8 bytes |
DataType::Float16 |
half::f16 |
2 bytes |
DataType::Float32 |
f32 |
4 bytes |
DataType::Float64 |
f64 |
8 bytes |
DataType::Complex64 |
num_complex::Complex32 |
8 bytes |
DataType::Complex128 |
num_complex::Complex64 |
16 bytes |
Key Design Features
- mmap-based Reading: All read operations (
load_array,getitem,stream_load) usememmap2with an automatic cache keyed bylast_modifiedtimestamp. Cache is invalidated on write/append/delete. - In-place Append:
append_rowsopens the data file in append mode and writes only the new data. No existing data is rewritten. Metadata is updated incrementally. - In-place Replace:
replace_rowsuses positional writes (pwrite) to update specific rows without touching unrelated data. - Logical Deletion:
drop_arrayswith indices uses a bitmap to mark rows as deleted. Read operations automatically skip deleted rows. Callcompact_arrayto physically reclaim space. - Adaptive Parallelism:
save_arraysautomatically uses Rayon parallel processing when saving multiple arrays with total size > 10MB. - Adaptive Buffering: Write buffer sizes are tuned by data size (256KB / 4MB / 16MB for small / medium / large arrays).
Concurrent Access
Multiple threads can safely write to the same storage concurrently (since v0.5.1+):
use numpack::prelude::*;
use ndarray::Array2;
use std::path::PathBuf;
use std::thread;
fn concurrent_write() -> NpkResult<()> {
let dir = "/tmp/numpack_data";
std::fs::create_dir_all(dir)?;
let handles: Vec<_> = (0..10)
.map(|i| {
let dir = dir.to_string();
thread::spawn(move || {
let io = ParallelIO::new(PathBuf::from(dir))?;
let data = Array2::<f32>::ones((100, 128)).into_dyn();
io.save_arrays(&[(format!("chunk_{}", i), data, DataType::Float32)])?;
io.sync_metadata()?;
Ok::<_, NpkError>(())
})
})
.collect();
for h in handles {
h.join().unwrap()?;
}
Ok(())
}
Best Practices for Concurrent Access:
- Each thread creates its own
ParallelIOinstance - Call
sync_metadata()before dropping the instance - For read-heavy workloads, use separate read instances
Performance Tips
// 1. Batch saves for multiple arrays (auto-parallel for large data)
let arrays: Vec<(String, ndarray::ArrayD<f32>, DataType)> = vec![
("a".to_string(), data_a, DataType::Float32),
("b".to_string(), data_b, DataType::Float32),
];
io.save_arrays(&arrays)?;
// 2. Use append_rows for incremental data (fastest, no rewrite)
let new_data = Array2::<f32>::ones((100, 128)).into_dyn();
io.append_rows("a", &new_data)?;
// 3. Use replace_rows for updating existing rows (pwrite, no rewrite)
let updated = Array2::<f32>::zeros((3, 128)).into_dyn();
io.replace_rows("a", &updated, &[0, 1, 2])?;
// 4. Use stream_load for large arrays that don't fit in memory
let iter: StreamIterator<f32> = io.stream_load("a", 50000)?;
for batch in iter {
let batch = batch?;
// process batch...
}
// 5. Call sync_metadata() once after all operations
io.sync_metadata()?;
// 6. Use compact_array() periodically after many deletions
io.drop_arrays("a", Some(&[0, 1, 2]))?;
io.compact_array("a")?;
Error Handling
use numpack::core::error::{NpkError, NpkResult};
match io.get_array_metadata("nonexistent") {
Ok(meta) => println!("Found: {:?}", meta.shape),
Err(NpkError::ArrayNotFound(name)) => println!("Array {} not found", name),
Err(e) => eprintln!("Error: {:?}", e),
}
Batch Modes
# Batch Mode - cached writes (21x speedup)
with npk.batch_mode():
for i in range(1000):
arr = npk.load('data')
arr[:10] *= 2.0
npk.save({'data': arr})
# Writable Batch Mode - direct mmap (108x speedup)
with npk.writable_batch_mode() as wb:
arr = wb.load('data')
arr[:10] *= 2.0 # Auto-persisted
Vector Engine
SIMD-accelerated similarity search (AVX2, AVX-512, NEON, SVE).
from numpack.vector_engine import VectorEngine, StreamingVectorEngine
# In-memory search
engine = VectorEngine()
indices, scores = engine.top_k_search(query, candidates, 'cosine', k=10)
# Multi-query batch (30-50% faster)
all_indices, all_scores = engine.multi_query_top_k(queries, candidates, 'cosine', k=10)
# Streaming from file (for large datasets)
streaming = StreamingVectorEngine()
indices, scores = streaming.streaming_top_k_from_file(
query, 'vectors.npk', 'embeddings', 'cosine', k=10
)
Supported Metrics: cosine, dot, l2, l2sq, hamming, jaccard, kl, js
Format Conversion
Convert between NumPack and other formats (PyTorch, Arrow, Parquet, SafeTensors).
from numpack.io import from_tensor, to_tensor, from_table, to_table
# Memory <-> .npk (zero-copy when possible)
from_tensor(tensor, 'output.npk', array_name='embeddings') # tensor -> .npk
tensor = to_tensor('input.npk', array_name='embeddings') # .npk -> tensor
from_table(table, 'output.npk') # PyArrow Table -> .npk
table = to_table('input.npk') # .npk -> PyArrow Table
# File <-> File (streaming for large files)
from numpack.io import from_pt, to_pt
from_pt('model.pt', 'output.npk') # .pt -> .npk
to_pt('input.npk', 'output.pt') # .npk -> .pt
Supported formats: PyTorch (.pt), Feather, Parquet, SafeTensors, NumPy (.npy), HDF5, Zarr, CSV
Pack & Unpack
Portable .npkg format for easy migration and sharing.
from numpack import pack, unpack, get_package_info
# Pack NumPack directory into a single .npkg file
pack('data.npk') # -> data.npkg (with Zstd compression)
pack('data.npk', 'backup/data.npkg') # Custom output path
# Unpack .npkg back to NumPack directory
unpack('data.npkg') # -> data.npk
unpack('data.npkg', 'restored/') # Custom restore path
# View package info without extracting
info = get_package_info('data.npkg')
print(f"Files: {info['file_count']}, Compression: {info['compression_ratio']:.1%}")
Benchmarks
Tested on macOS Apple Silicon, 1M rows × 10 columns, Float32 (38.1MB)
| Operation | NumPack | NPY | Advantage |
|---|---|---|---|
| Full Load | 4.00ms | 6.56ms | 1.64x |
| Lazy Load | 0.002ms | 0.102ms | 51x |
| Replace 100 rows | 0.040ms | 13.74ms | 344x |
| Append 100 rows | 0.054ms | 18.26ms | 338x |
| Random Access (100) | 0.004ms | 0.002ms | ~equal |
Multi-Format Comparison
Core Operations (1M × 10, Float32, ~38.1MB):
| Operation | NumPack | NPY | Zarr | HDF5 | Parquet | Arrow |
|---|---|---|---|---|---|---|
| Save | 11.94ms | 6.48ms | 70.91ms | 58.07ms | 142.11ms | 16.85ms |
| Full Load | 4.00ms | 6.56ms | 32.86ms | 53.99ms | 16.49ms | 12.39ms |
| Lazy Load | 0.002ms | 0.102ms | 0.374ms | 0.082ms | N/A | N/A |
| Replace 100 | 0.040ms | 13.74ms | 7.61ms | 0.29ms | 162.48ms | 26.93ms |
| Append 100 | 0.054ms | 18.26ms | 9.05ms | 0.39ms | 173.45ms | 42.46ms |
Random Access Performance:
| Batch Size | NumPack | NPY (mmap) | Zarr | HDF5 | Parquet | Arrow |
|---|---|---|---|---|---|---|
| 100 rows | 0.004ms | 0.002ms | 2.66ms | 0.66ms | 16.25ms | 12.43ms |
| 1K rows | 0.025ms | 0.021ms | 2.86ms | 5.02ms | 16.48ms | 12.61ms |
| 10K rows | 0.118ms | 0.112ms | 16.63ms | 505.71ms | 17.45ms | 12.81ms |
Batch Mode Performance (100 consecutive operations):
| Mode | Time | Speedup |
|---|---|---|
| Normal | 414ms | - |
| Batch Mode | 20.1ms | 21x |
| Writable Batch | 4.5ms | 92x |
File Size:
| Format | Size | Compression |
|---|---|---|
| NumPack | 38.15MB | - |
| NPY | 38.15MB | - |
| NPZ | 34.25MB | ✓ |
| Zarr | 34.13MB | ✓ |
| HDF5 | 38.18MB | - |
| Parquet | 44.09MB | ✓ |
| Arrow | 38.16MB | - |
When to Use NumPack
| Use Case | Recommendation |
|---|---|
| Frequent modifications | ✅ NumPack (344x faster) |
| ML/DL pipelines | ✅ NumPack (zero-copy random access, no full load) |
| Vector similarity search | ✅ NumPack (SIMD) |
| Write-once, read-many | ✅ NumPack (1.64x faster read) |
| Extreme compression | ✅ NumPack .npkg (better ratio, streaming, high I/O) |
| RAG/Embedding storage | ✅ NumPack (fast retrieval + SIMD search) |
| Feature store | ✅ NumPack (real-time updates + low latency) |
| Memory-constrained environments | ✅ NumPack (mmap + lazy loading) |
| Multi-process data sharing | ✅ NumPack (zero-copy mmap) |
| Incremental data pipelines | ✅ NumPack (338x faster append) |
| Real-time feature updates | ✅ NumPack (ms-level replace) |
Documentation
See docs/ for detailed guides and unified_benchmark.py for benchmark code.
Contributing
Contributions welcome! Please submit a Pull Request.
License
Apache License 2.0 - see LICENSE for details.
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 Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file numpack-0.6.0.tar.gz.
File metadata
- Download URL: numpack-0.6.0.tar.gz
- Upload date:
- Size: 365.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2de83ac3b1b48f9485163060063f063f6dc7237b73faa5c460cfbb20299f317f
|
|
| MD5 |
12f1c7d029db422f9369e6013811b219
|
|
| BLAKE2b-256 |
a9d5a50ae3000e7b849a427887f383d4a3cccb0f5a51daede59219cbc8b86b9a
|
File details
Details for the file numpack-0.6.0-cp314-cp314-win_amd64.whl.
File metadata
- Download URL: numpack-0.6.0-cp314-cp314-win_amd64.whl
- Upload date:
- Size: 749.2 kB
- Tags: CPython 3.14, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
af698bc242872257022dc3ae3f45be2c945b3b3b31b4f7c79236dcc53994edb0
|
|
| MD5 |
a1bef7a8c2b72ad9ff3d52dd9a113b67
|
|
| BLAKE2b-256 |
7d234ccf1d525eb45042b967ecc11e290854bf31eb8da73804af7f7bb1b760c3
|
File details
Details for the file numpack-0.6.0-cp314-cp314-macosx_11_0_arm64.whl.
File metadata
- Download URL: numpack-0.6.0-cp314-cp314-macosx_11_0_arm64.whl
- Upload date:
- Size: 834.3 kB
- Tags: CPython 3.14, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
68243d8ee4ed28ea290c17a19bda2e36400e2c116f79dfd65def8ffc04f94421
|
|
| MD5 |
01da07a5962c57f7d2c54dc0db648686
|
|
| BLAKE2b-256 |
67c7d226ba3672c38ed59d39d8fed46186603f3fff4c5dc547b3637f4510bef9
|
File details
Details for the file numpack-0.6.0-cp313-cp313-win_amd64.whl.
File metadata
- Download URL: numpack-0.6.0-cp313-cp313-win_amd64.whl
- Upload date:
- Size: 752.3 kB
- Tags: CPython 3.13, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f5b23cb54e75c3ce4cee4da0b28cb80db1515094c864907443bcd7962d5883e0
|
|
| MD5 |
0a2636bdae083f229f1c40d10e96de99
|
|
| BLAKE2b-256 |
754389717fec7d0a85bee5bc5dce28f31d2f37724d838a4dec35a766474e2696
|
File details
Details for the file numpack-0.6.0-cp313-cp313-manylinux_2_38_x86_64.whl.
File metadata
- Download URL: numpack-0.6.0-cp313-cp313-manylinux_2_38_x86_64.whl
- Upload date:
- Size: 13.3 MB
- Tags: CPython 3.13, manylinux: glibc 2.38+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3cef75cafdf658ddbbd79bd5ac6b7aa815a3da82e28873a59e0e541c9f8e02da
|
|
| MD5 |
0059433fccb1e37a0183985c63ebbf27
|
|
| BLAKE2b-256 |
da78401c7478587eedcfbb320e04f48d58af29a2a242a239b7524ae6681a88e8
|
File details
Details for the file numpack-0.6.0-cp313-cp313-macosx_11_0_arm64.whl.
File metadata
- Download URL: numpack-0.6.0-cp313-cp313-macosx_11_0_arm64.whl
- Upload date:
- Size: 835.8 kB
- Tags: CPython 3.13, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8d60a4dfc6689212b68ff17cf8201093cfe652f973a424f12bee96556b496d38
|
|
| MD5 |
46ad260c819554c878c6c48004f35c45
|
|
| BLAKE2b-256 |
50c36db38120b19db94588ba7d6e64d8a581d844f8a7841ae45e9bfe581a958d
|
File details
Details for the file numpack-0.6.0-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: numpack-0.6.0-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 752.9 kB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
29bdc43e983a26510b36a3b4ce8610e6d0de4b6355f46bdb95d5c459236a1099
|
|
| MD5 |
9a69926441d1fc9a69d63d86ba549cbb
|
|
| BLAKE2b-256 |
a5e5b259ea3f00aef211cdd581a983b6cf171f6ead5cb423e66660758752d74d
|
File details
Details for the file numpack-0.6.0-cp312-cp312-manylinux_2_38_x86_64.whl.
File metadata
- Download URL: numpack-0.6.0-cp312-cp312-manylinux_2_38_x86_64.whl
- Upload date:
- Size: 13.3 MB
- Tags: CPython 3.12, manylinux: glibc 2.38+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a1bbe69b1ab08d8f21947f6ac5c931cf4106802acc5a9c54f39e7a248cb7d145
|
|
| MD5 |
4a997904ebdf6510fe5f7ca9684be821
|
|
| BLAKE2b-256 |
0dcfd6531a14e4d57d74d52623869480ebdbd617ba55b63b595564052b9c9d49
|
File details
Details for the file numpack-0.6.0-cp312-cp312-macosx_11_0_arm64.whl.
File metadata
- Download URL: numpack-0.6.0-cp312-cp312-macosx_11_0_arm64.whl
- Upload date:
- Size: 836.0 kB
- Tags: CPython 3.12, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cb4a7a75ff3e7bf6065a04ef470614e0d61efdc69895935307a51c1f7046436f
|
|
| MD5 |
fa41735e3d4d480de5178ca084520e4f
|
|
| BLAKE2b-256 |
5d60d3bee10b351c01e1ee9adc619039c6bf23d28d454248ac552d705d1b1fab
|
File details
Details for the file numpack-0.6.0-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: numpack-0.6.0-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 752.3 kB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2259c4482b4db75239e178d6c2883cef564f839fcc452ac29cdf5c3c40f1613e
|
|
| MD5 |
14bbc12b9e25564f080492a0a3b5a5f1
|
|
| BLAKE2b-256 |
f8316b95bb7d591ae0a1cb81ec9a6fc827887e57853e40d76948e46583230045
|
File details
Details for the file numpack-0.6.0-cp311-cp311-manylinux_2_38_x86_64.whl.
File metadata
- Download URL: numpack-0.6.0-cp311-cp311-manylinux_2_38_x86_64.whl
- Upload date:
- Size: 13.3 MB
- Tags: CPython 3.11, manylinux: glibc 2.38+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
89837a6195c758339ab36449b2cb54b73e52b888e31d58f33e1632f70e8083c2
|
|
| MD5 |
4be2fcdd46130d91380c60ddebcce350
|
|
| BLAKE2b-256 |
6e74adf2e42c0a8df5d9aa58d0e2fbfbb8900e944ef7c5e6a2af3dc2de7c49c8
|
File details
Details for the file numpack-0.6.0-cp311-cp311-macosx_11_0_arm64.whl.
File metadata
- Download URL: numpack-0.6.0-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 836.8 kB
- Tags: CPython 3.11, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6ec313999953a51fd50bd7af9c491fd120bafef47aa4bde4f62bf4e74e234083
|
|
| MD5 |
1cde5a8da6fb688fdf880dca315f5378
|
|
| BLAKE2b-256 |
087b4604a13e63b6799d8b0f4903e690566b419f86eb6735fa1780298072b54d
|
File details
Details for the file numpack-0.6.0-cp310-cp310-win_amd64.whl.
File metadata
- Download URL: numpack-0.6.0-cp310-cp310-win_amd64.whl
- Upload date:
- Size: 752.3 kB
- Tags: CPython 3.10, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
99ffc142808cc3494520b707a5bc7aa67681f1435fe6d11b8fd5a86d05ac246f
|
|
| MD5 |
548be15f769cf479f1d9d0df15ff07d2
|
|
| BLAKE2b-256 |
6024806164d6e2275f5cfd5edbfdefab987b56f6e1cdae0655036d39c8549738
|
File details
Details for the file numpack-0.6.0-cp310-cp310-manylinux_2_38_x86_64.whl.
File metadata
- Download URL: numpack-0.6.0-cp310-cp310-manylinux_2_38_x86_64.whl
- Upload date:
- Size: 13.3 MB
- Tags: CPython 3.10, manylinux: glibc 2.38+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9928aa17658c1dd1b78d2ac020d0e0f583551121b3730b3f589eb03f10927862
|
|
| MD5 |
2c1588a66db13b568c0cd6b8eebde221
|
|
| BLAKE2b-256 |
b803884b29f70d2756307156c732bebec9211388ec051e538af0e73f37a8f1a4
|
File details
Details for the file numpack-0.6.0-cp310-cp310-macosx_11_0_arm64.whl.
File metadata
- Download URL: numpack-0.6.0-cp310-cp310-macosx_11_0_arm64.whl
- Upload date:
- Size: 837.3 kB
- Tags: CPython 3.10, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
915b6d3eef98d685713ddfe46b81166b417dbc30a4b81024f81155dbb16ec99e
|
|
| MD5 |
9917a1c9d6e875857e701b600aaa7a79
|
|
| BLAKE2b-256 |
892f035648fd5b8862c4d43f540cdf715e2962971b530296fd5bdbfa56d2844c
|
File details
Details for the file numpack-0.6.0-cp39-cp39-win_amd64.whl.
File metadata
- Download URL: numpack-0.6.0-cp39-cp39-win_amd64.whl
- Upload date:
- Size: 752.3 kB
- Tags: CPython 3.9, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5f772692f92ba5cd4e221a2aa5193bcc03e30dd22e41eb4bd8789c1d6518ec68
|
|
| MD5 |
4c7b6306f6abcf04fa36098243dfde59
|
|
| BLAKE2b-256 |
069fb88f9ca4f91ea12d7cc284977f2327c8f0239abd11a12e7468bfa8a53c6b
|
File details
Details for the file numpack-0.6.0-cp39-cp39-manylinux_2_38_x86_64.whl.
File metadata
- Download URL: numpack-0.6.0-cp39-cp39-manylinux_2_38_x86_64.whl
- Upload date:
- Size: 13.3 MB
- Tags: CPython 3.9, manylinux: glibc 2.38+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c18118b16030e0dc4fc124dc3ef3072c091e25b8b24576d99e25bfb808648d6e
|
|
| MD5 |
78cae98571d43de317bf58ea009af338
|
|
| BLAKE2b-256 |
ad1c407d970e94fd75643e4c23cc23c35f61aaf58af8a62a21b10d7fa3834990
|
File details
Details for the file numpack-0.6.0-cp39-cp39-macosx_11_0_arm64.whl.
File metadata
- Download URL: numpack-0.6.0-cp39-cp39-macosx_11_0_arm64.whl
- Upload date:
- Size: 837.5 kB
- Tags: CPython 3.9, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7721e5a67a8bf568a46b8a3626ce11900c8ade307d3ce2d30fa3b31920e3a01d
|
|
| MD5 |
40d37b2574c06995c13c5c75262c2afa
|
|
| BLAKE2b-256 |
a64afd34159e8bcb77d376f9f51c5f85ccbdf38706d0489d3706cd84b707b774
|