Skip to main content

A high-performance array storage and manipulation library

Project description

NumPack

NumPack is a high-performance array storage library that combines Rust's performance with Python's ease of use. It provides exceptional performance for both reading and writing large NumPy arrays, with special optimizations for in-place modifications.

Key Features

  • 321x faster row replacement than NPY
  • 224x faster data append than NPY
  • 45x faster lazy loading than NPY mmap
  • 1.58x faster full data loading than NPY
  • Random Access: 1K indices 2.4x slower, 10K indices 16.4x slower than NPY
  • 20.4x speedup with Batch Mode for frequent modifications
  • 94.8x speedup with Writable Batch Mode
  • Zero-copy operations with minimal memory footprint
  • Seamless integration with existing NumPy workflows
  • Vector Engine: SIMD-accelerated vector similarity search (AVX2, AVX-512, NEON, SVE)

New I/O Optimizations

  1. Adaptive Buffer Sizing

    • Small arrays (<1MB): 256KB buffer → 96% memory saving
    • Medium arrays (1-10MB): 4MB buffer → balanced performance
    • Large arrays (>10MB): 16MB buffer → maximum throughput
  2. Smart Parallelization

    • Automatically parallelizes only when beneficial (>10MB total data)
    • Avoids thread overhead for small datasets
  3. Fast Overwrite Path

    • Same-shape array overwrite: 1.5-2.5x faster
    • Uses in-place update instead of file recreation
  4. SIMD Acceleration

    • Large files (>10MB) use SIMD-optimized operations
    • Theoretical 2-4x speedup for memory-intensive operations
  5. Batch Mode Intelligence

    • Smart dirty tracking: only flushes modified arrays
    • Zero-copy cache detection
    • Reduced metadata synchronization

Core Advantages Enhanced

  • Replace operations now 321x faster than NPY
  • Full Load now 1.58x faster than NPY
  • System-wide optimizations benefit all operation modes

Features

  • High Performance: Optimized for both reading and writing large numerical arrays
  • Lazy Loading Support: Efficient memory usage through on-demand data loading
  • In-place Operations: Support for in-place array modifications without full file rewrite
  • Batch Processing Modes:
    • Batch Mode: 21x speedup for batch operations
    • Writable Batch Mode: 89x speedup for frequent modifications
  • Vector Engine: High-performance vector similarity search
    • SIMD acceleration: AVX2, AVX-512, NEON, SVE
    • In-memory and streaming (from file) search modes
    • Multiple metrics: cosine, dot product, L2, hamming, jaccard, KL/JS divergence
    • Multi-query batch optimization (30-50% faster)
  • Multiple Data Types: Supports various numerical data types including:
    • Boolean
    • Unsigned integers (8-bit to 64-bit)
    • Signed integers (8-bit to 64-bit)
    • Floating point (16-bit, 32-bit and 64-bit)
    • Complex numbers (64-bit and 128-bit)

Installation

From PyPI (Recommended)

Prerequisites

  • Python >= 3.9
  • NumPy >= 1.26.0
pip install numpack

From Source

Prerequisites (All Platforms including Windows)

  • Python >= 3.9
  • Rust >= 1.70.0 (Required on all platforms, install from rustup.rs)
  • NumPy >= 1.26.0
  • Appropriate C/C++ compiler
    • Windows: Microsoft C++ Build Tools
    • macOS: Xcode Command Line Tools (xcode-select --install)
    • Linux: GCC/Clang (build-essential on Ubuntu/Debian)

Build Steps

  1. Clone the repository:
git clone https://github.com/BirchKwok/NumPack.git
cd NumPack
  1. Install maturin:
pip install maturin>=1.0,<2.0
  1. Build and install:
# Install in development mode
maturin develop

# Or build wheel package
maturin build --release
pip install target/wheels/numpack-*.whl

Usage

Basic Operations

import numpy as np
from numpack import NumPack

# Using context manager (Recommended)
with NumPack("data_directory") as npk:
    # Save arrays
    arrays = {
        'array1': np.random.rand(1000, 100).astype(np.float32),
        'array2': np.random.rand(500, 200).astype(np.float32)
    }
    npk.save(arrays)
    
    # Load arrays - Normal mode
    loaded = npk.load("array1")
    
    # Load arrays - Lazy mode
    lazy_array = npk.load("array1", lazy=True)

Advanced Operations

with NumPack("data_directory") as npk:
    # Replace specific rows
    replacement = np.random.rand(10, 100).astype(np.float32)
    npk.replace({'array1': replacement}, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    
    # Append new data
    new_data = {'array1': np.random.rand(100, 100).astype(np.float32)}
    npk.append(new_data)
    
    # Drop arrays or specific rows
    npk.drop('array1')  # Drop entire array
    npk.drop('array2', [0, 1, 2])  # Drop specific rows
    
    # Random access operations
    data = npk.getitem('array1', [0, 1, 2])
    data = npk['array1']  # Dictionary-style access
    
    # Stream loading for large arrays
    for batch in npk.stream_load('array1', buffer_size=1000):
        process_batch(batch)

Batch Processing Modes

NumPack provides two high-performance batch modes for scenarios with frequent modifications:

Batch Mode (21x speedup, 43% faster than before)

with NumPack("data.npk") as npk:
    with npk.batch_mode():
        for i in range(1000):
            arr = npk.load('data')      # Load from cache
            arr[:10] *= 2.0
            npk.save({'data': arr})     # Save to cache
# All changes written to disk on exit
# Now with smart dirty tracking and zero-copy detection

Writable Batch Mode (89x speedup)

with NumPack("data.npk") as npk:
    with npk.writable_batch_mode() as wb:
        for i in range(1000):
            arr = wb.load('data')   # Memory-mapped view
            arr[:10] *= 2.0         # Direct modification
            # No save needed - changes are automatic

Vector Engine

NumPack includes a high-performance vector similarity search engine with SIMD acceleration (AVX2, AVX-512, NEON, SVE). It provides two main classes for different use cases:

VectorSearch - In-Memory Search

For datasets that fit in memory, VectorSearch provides fast similarity computation:

from numpack.vector_engine import VectorSearch
import numpy as np

engine = VectorSearch()
print(engine.capabilities())  # Show SIMD features, e.g., "CPU: AVX2, AVX-512"

# Single pair computation
a = np.array([1.0, 2.0, 3.0], dtype=np.float32)
b = np.array([4.0, 5.0, 6.0], dtype=np.float32)
score = engine.compute_metric(a, b, 'cosine')

# Batch computation
query = np.random.randn(128).astype(np.float32)
candidates = np.random.randn(10000, 128).astype(np.float32)
scores = engine.batch_compute(query, candidates, 'cosine')

# Top-K search
indices, scores = engine.top_k_search(query, candidates, 'cosine', k=10)

# Multi-query batch search (30-50% faster than loop)
queries = np.random.randn(100, 128).astype(np.float32)
all_indices, all_scores = engine.multi_query_top_k(queries, candidates, 'cosine', k=10)
all_indices = all_indices.reshape(100, 10)  # Reshape to [n_queries, k]

StreamingVectorSearch - Memory-Efficient File Search

For large datasets that don't fit in memory, StreamingVectorSearch reads directly from NumPack files:

from numpack import NumPack
from numpack.vector_engine import StreamingVectorSearch
import numpy as np

streaming = StreamingVectorSearch()
query = np.random.randn(128).astype(np.float32)

with NumPack('vectors.npk') as npk:
    # Top-K search from file (10-30x faster than Python-based streaming)
    indices, scores = streaming.streaming_top_k_from_file(
        query, str(npk._filename), 'embeddings', 'cosine', k=10, batch_size=10000
    )
    
    # Compute all scores from file
    all_scores = streaming.streaming_batch_compute(
        query, str(npk._filename), 'embeddings', 'cosine', batch_size=10000
    )
    
    # Multi-query streaming search (2x faster than individual calls)
    queries = np.random.randn(100, 128).astype(np.float32)
    all_indices, all_scores = streaming.streaming_multi_query_top_k(
        queries, str(npk._filename), 'embeddings', 'cosine', k=10, batch_size=10000
    )

Supported Metrics

Metric Type Aliases Description
Similarity (higher is better)
Dot Product dot, dot_product, dotproduct Inner product of vectors
Cosine cos, cosine, cosine_similarity Cosine similarity
Inner Product inner, inner_product Same as dot product
Distance (lower is better)
L2/Euclidean l2, euclidean, l2_distance Euclidean distance
Squared L2 l2sq, l2_squared, squared_euclidean Squared Euclidean distance
Hamming hamming Hamming distance (uint8 only)
Jaccard jaccard Jaccard distance (uint8 only)
KL Divergence kl, kl_divergence Kullback-Leibler divergence
JS Divergence js, js_divergence Jensen-Shannon divergence

Supported Data Types

  • Float types: float64, float32, float16
  • Integer types: int8, int16, int32, int64, uint8, uint16, uint32, uint64
  • Mixed dtype: Query and candidates can have different dtypes (auto-converted to float64)
  • Binary vectors: uint8 for hamming/jaccard metrics

Performance

All benchmarks were conducted on macOS (Apple Silicon) using the Rust backend with precise timeit measurements.

Performance Comparison (1M rows × 10 columns, Float32, 38.1MB)

Operation NumPack NPY NPZ Zarr HDF5 NumPack Advantage
Full Load 4.11ms 6.48ms 168.33ms 34.29ms 50.59ms 1.58x vs NPY
Lazy Load 0.002ms 0.091ms N/A 0.405ms 0.078ms 45x vs NPY
Replace 100 rows 0.042ms 13.49ms 1514ms 7.68ms 0.33ms 321x vs NPY
Append 100 rows 0.091ms 20.40ms 1522ms 9.15ms 0.20ms 224x vs NPY
Save 12.73ms 6.53ms 1343ms 74.02ms 56.32ms 1.95x slower

Random Access Performance

Batch Size NumPack NPY (actual read) NPZ Zarr HDF5 NumPack Advantage
100 indices 0.038ms 0.002ms 169.54ms 2.88ms 0.58ms 15.4x slower
1K indices 0.060ms 0.025ms 169.04ms 3.25ms 4.53ms 2.4x slower
10K indices 1.53ms 0.093ms 169.80ms 17.94ms 511.16ms 16.4x slower

Sequential Access Performance

Batch Size NumPack NPY (actual read) NPZ Zarr HDF5 NumPack Advantage
100 rows 0.030ms 0.001ms 169.85ms 2.68ms 0.13ms 28.5x slower
1K rows 0.049ms 0.002ms 169.52ms 2.94ms 0.17ms 29.7x slower
10K rows 0.321ms 0.008ms 169.17ms 3.05ms 0.78ms 41.2x slower

Performance Comparison (100K rows × 10 columns, Float32, 3.8MB)

Operation NumPack NPY NPZ Zarr HDF5 NumPack Advantage
Full Load 0.326ms 0.405ms 17.27ms 4.96ms 5.60ms 1.24x vs NPY
Lazy Load 0.003ms 0.094ms N/A 0.390ms 0.086ms 37x vs NPY
Replace 100 rows 0.031ms 1.21ms 153.05ms 3.87ms 0.31ms 39x vs NPY
Append 100 rows 0.058ms 1.83ms 153.47ms 4.13ms 0.21ms 32x vs NPY

Random Access Performance

Batch Size NumPack NPY (actual read) NPZ Zarr HDF5 NumPack Advantage
100 indices 0.032ms 0.002ms 17.38ms 1.31ms 0.58ms 13.0x slower
1K indices 0.057ms 0.019ms 17.36ms 1.63ms 4.79ms 3.0x slower
10K indices 0.274ms 0.125ms 17.38ms 4.81ms 163.58ms 2.2x slower

Sequential Access Performance

Batch Size NumPack NPY (actual read) NPZ Zarr HDF5 NumPack Advantage
100 rows 0.019ms 0.001ms 17.24ms 1.24ms 0.12ms 17.5x slower
1K rows 0.036ms 0.002ms 17.23ms 1.37ms 0.16ms 20.2x slower
10K rows 0.264ms 0.008ms 17.34ms 1.48ms 0.63ms 33.8x slower

Batch Mode Performance (1M rows × 10 columns)

100 consecutive modify operations:

Mode Time Speedup vs Normal
Normal Mode 418ms -
Batch Mode 20.5ms 20.4x faster
Writable Batch Mode 4.4ms 94.8x faster

Note: All modes benefit from I/O optimizations. Speedup ratios are calculated against Normal Mode baseline.

Key Performance Highlights

  1. Data Modification - Exceptional Performance

    • Replace operations: 321x faster than NPY
    • Append operations: 224x faster than NPY (large dataset)
    • Supports efficient in-place modification without full file rewrite
    • NumPack's core advantage for write-heavy workloads
  2. Data Loading - Outstanding Performance Enhanced

    • Full load: 1.58x faster than NPY (4.11ms vs 6.48ms)
    • Lazy load: 45x faster than NPY mmap (0.002ms vs 0.091ms)
    • Optimized with adaptive buffering and SIMD acceleration
  3. Batch Processing - Excellent Performance Strong

    • Batch Mode: 20.4x speedup (20.5ms vs 418ms normal mode)
    • Writable Batch Mode: 94.8x speedup (4.4ms)
    • System-wide I/O optimizations benefit all modes
  4. Sequential Access

    • Small batch (100 rows): 17.5x slower than NPY (0.019ms vs 0.001ms)
    • Medium batch (1K rows): 20.2x slower (0.036ms vs 0.002ms)
    • Large batch (10K rows): 33.8x slower (0.264ms vs 0.008ms)
    • Still significantly faster than all other formats (Zarr: 3.05ms, HDF5: 0.78ms, NPZ: 169ms)
    • Note: Tests use real data reads; NPY mmap view-only is faster but not practical
  5. Random Access - Significantly Improved Major Enhancement

    • Small batch (100 indices): 15.4x slower (0.038ms vs 0.002ms)
    • Medium batch (1K indices): 2.4x slower (0.060ms vs 0.025ms) Improved from 397x!
    • Large batch (10K indices): 16.4x slower (1.53ms vs 0.093ms) - affected by page faults
    • However: NumPack still 334x faster than HDF5 for 10K random access (1.53ms vs 511ms)
    • Key trade-off: NPY excels at random read BUT 321x slower on writes
    • For mixed read-write workloads, NumPack offers better overall balance
  6. Storage Efficiency

    • File size identical to NPY (38.15MB)
    • ~10% smaller than Zarr/NPZ (compressed formats)

When to Use NumPack

Strongly Recommended (85% of use cases):

  • Machine learning and deep learning pipelines
  • Real-time data stream processing
  • Data annotation and correction workflows
  • Feature stores with dynamic updates
  • Any scenario requiring frequent data modifications (321x faster writes!)
  • Fast data loading requirements (1.58x faster than NPY)
  • Balanced read-write workloads
  • Sequential data processing workflows
  • Vector similarity search with SIMD acceleration
  • Large-scale embedding search from disk without loading all data

Consider Alternatives (15% of use cases):

  • Write-once, never modify → Use NPY (1.95x faster write, but 321x slower for updates)
  • Frequent random access → Use NPY (2.4x-16x faster for random reads)
  • Pure read-only with heavy sequential access → Use NPY mmap (20-41x faster)
  • Extreme compression requirements → Use NPZ (10% smaller, but 1000x slower)

Performance Trade-offs & Insights:

  • Write operations: NumPack dominant (321x faster replacements, 224x faster appends)
  • Read operations: NPY faster for random/sequential access (2.4x-41x), especially for small batches
  • Major improvement: 1K random access improved from 397x to 2.4x slower
  • Overall balance: NumPack excels in mixed read-write workloads
  • For pure read-heavy (>95% reads), NPY may be better
  • For write-intensive or balanced workloads (>5% writes), NumPack is superior
  • Key insight: Tests use real data reads; NPY mmap view-only is faster but not practical

Best Practices

1. Use Writable Batch Mode for Frequent Modifications

# 94.8x speedup for frequent modifications
with NumPack("data.npk") as npk:
    with npk.writable_batch_mode() as wb:
        for i in range(1000):
            arr = wb.load('data')
            arr[:10] *= 2.0
# Automatic persistence on exit

2. Use Batch Mode for Batch Operations

# 20.4x speedup for batch processing
with NumPack("data.npk") as npk:
    with npk.batch_mode():
        for i in range(1000):
            arr = npk.load('data')
            arr[:10] *= 2.0
            npk.save({'data': arr})
# Single write on exit with smart dirty tracking

3. Use Lazy Loading for Large Datasets

with NumPack("large_data.npk") as npk:
    # Only 0.002ms to initialize
    lazy_array = npk.load("array", lazy=True)
    # Data loaded on demand
    subset = lazy_array[1000:2000]

4. Reuse NumPack Instances

# Efficient: Reuse instance
with NumPack("data.npk") as npk:
    for i in range(100):
        data = npk.load('array')

# Inefficient: Create new instance each time
for i in range(100):
    with NumPack("data.npk") as npk:
        data = npk.load('array')

5. Use Vector Engine for Similarity Search

from numpack.vector_engine import VectorSearch, StreamingVectorSearch

# In-memory search (data fits in memory)
engine = VectorSearch()
indices, scores = engine.top_k_search(query, candidates, 'cosine', k=10)

# Streaming search (large datasets)
streaming = StreamingVectorSearch()
with NumPack('large_vectors.npk') as npk:
    indices, scores = streaming.streaming_top_k_from_file(
        query, str(npk._filename), 'embeddings', 'cosine', k=10, batch_size=10000
    )

6. Use Multi-Query Batch for Multiple Queries

# Efficient: Process all queries in one call (30-50% faster)
engine = VectorSearch()
all_indices, all_scores = engine.multi_query_top_k(queries, candidates, 'cosine', k=10)

# Less efficient: Loop over queries
for query in queries:
    indices, scores = engine.top_k_search(query, candidates, 'cosine', k=10)

Benchmark Methodology

All benchmarks use:

  • timeit for precise timing
  • Multiple repeats, best time selected
  • Pure operation time (excluding file open/close overhead)
  • Float32 arrays
  • macOS Apple Silicon (results may vary by platform)
  • Comprehensive testing across multiple formats (NPY, NPZ, Zarr, HDF5, Parquet, Arrow/Feather)

New in this version:

  • Added random access and sequential access benchmarks across different batch sizes (100, 1K, 10K)
  • Important: NPY mmap tests force actual data reads using np.array() conversion, not just view creation
    • This provides fair comparison as NumPack returns actual data
    • Mmap view-only access is faster but not practical for real workloads
    • Results reflect real-world performance when data is actually used

For complete benchmark code, see unified_benchmark.py.

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the Apache License, Version 2.0 - see the LICENSE file for details.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

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

numpack-0.4.5.tar.gz (391.2 kB view details)

Uploaded Source

Built Distributions

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

numpack-0.4.5-cp314-cp314-win_amd64.whl (653.7 kB view details)

Uploaded CPython 3.14Windows x86-64

numpack-0.4.5-cp314-cp314-macosx_11_0_arm64.whl (739.2 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

numpack-0.4.5-cp313-cp313-win_amd64.whl (651.2 kB view details)

Uploaded CPython 3.13Windows x86-64

numpack-0.4.5-cp313-cp313-manylinux_2_34_x86_64.whl (846.0 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ x86-64

numpack-0.4.5-cp313-cp313-macosx_11_0_arm64.whl (737.8 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

numpack-0.4.5-cp312-cp312-win_amd64.whl (651.6 kB view details)

Uploaded CPython 3.12Windows x86-64

numpack-0.4.5-cp312-cp312-manylinux_2_34_x86_64.whl (846.6 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ x86-64

numpack-0.4.5-cp312-cp312-macosx_11_0_arm64.whl (738.1 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

numpack-0.4.5-cp311-cp311-win_amd64.whl (651.6 kB view details)

Uploaded CPython 3.11Windows x86-64

numpack-0.4.5-cp311-cp311-manylinux_2_34_x86_64.whl (847.1 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ x86-64

numpack-0.4.5-cp311-cp311-macosx_11_0_arm64.whl (738.9 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

numpack-0.4.5-cp310-cp310-win_amd64.whl (651.8 kB view details)

Uploaded CPython 3.10Windows x86-64

numpack-0.4.5-cp310-cp310-manylinux_2_34_x86_64.whl (847.7 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ x86-64

numpack-0.4.5-cp310-cp310-macosx_11_0_arm64.whl (739.3 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

numpack-0.4.5-cp39-cp39-win_amd64.whl (651.8 kB view details)

Uploaded CPython 3.9Windows x86-64

numpack-0.4.5-cp39-cp39-manylinux_2_34_x86_64.whl (847.0 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.34+ x86-64

numpack-0.4.5-cp39-cp39-macosx_11_0_arm64.whl (739.7 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

File details

Details for the file numpack-0.4.5.tar.gz.

File metadata

  • Download URL: numpack-0.4.5.tar.gz
  • Upload date:
  • Size: 391.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.11

File hashes

Hashes for numpack-0.4.5.tar.gz
Algorithm Hash digest
SHA256 73a224c385e82179fa2608bf254bf8f42622140369e88f0f39b214d80f83fd8f
MD5 b3fdced5df45d0e3d27356e91b6d3ecc
BLAKE2b-256 540e854f70897a6c1164454e9baa79ce8c71906bfbe530a3dd69106e87ebaebb

See more details on using hashes here.

File details

Details for the file numpack-0.4.5-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: numpack-0.4.5-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 653.7 kB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.11

File hashes

Hashes for numpack-0.4.5-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 c071a438e583339fb7ee6ab8b7b2baa7237c1c233dd401ebfc55dd872bc6e862
MD5 6a9f34a9eca46fb2e7146ae491c29870
BLAKE2b-256 f765e14cf42d5412f3a7c34b189ac7889dbf57d608fe83238218e36e5e55ca87

See more details on using hashes here.

File details

Details for the file numpack-0.4.5-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for numpack-0.4.5-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 88f799acd082d2bbeb30833342d2c486f887bd5e142545667f1d2fcd0b14dba4
MD5 957e6b59e54b74972112dc6165738d81
BLAKE2b-256 53fc6f3a9333228e94b1bde9181ebb8e0b7959e1e9cc96d7feafe4badcf6bde8

See more details on using hashes here.

File details

Details for the file numpack-0.4.5-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: numpack-0.4.5-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 651.2 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.11

File hashes

Hashes for numpack-0.4.5-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 a5d9bd4703551b21c0dbc4343d628baed4aea20d402cd8f0b63a2c8a5a05c021
MD5 19c889b789e53c39a08b75269a786c28
BLAKE2b-256 558ce84c072df1dca522254ecef5fea0f1bfa2bd8402903fb269710e10222cf2

See more details on using hashes here.

File details

Details for the file numpack-0.4.5-cp313-cp313-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for numpack-0.4.5-cp313-cp313-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 a08061a9ca539829820ce33e9887ca1060513469e4d58b1bff023e5692219216
MD5 ab70c65ce3defd13bb00d33df2347ae6
BLAKE2b-256 87b7942ced4f571d2ed29daecd40714e13b33170d3357b3cab63d4f9c6d00bb2

See more details on using hashes here.

File details

Details for the file numpack-0.4.5-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for numpack-0.4.5-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2947f10bc4bfa4b46cb13ec3ded991759df34a19cddb82086e7e779c375e6e0a
MD5 83f82307c006655c9dd0a8f5840da281
BLAKE2b-256 ec9923f14d87b944edc98ff90408a7d5e27a18eac1835c10b8fd9dc2b85be40b

See more details on using hashes here.

File details

Details for the file numpack-0.4.5-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: numpack-0.4.5-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 651.6 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.11

File hashes

Hashes for numpack-0.4.5-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 a051acfa5024a305aea553acaedf971ea8b985c76383ac999e35b855345238ef
MD5 7c6a6859c55e52ad42778ebbe5dae1ec
BLAKE2b-256 e8a3efad49ddc131a2b3828febb8cc6b689978f2866e95062ddbeede28c8b73e

See more details on using hashes here.

File details

Details for the file numpack-0.4.5-cp312-cp312-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for numpack-0.4.5-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 5ba605e204d6179820aee819187634226cd115e71da4f381f9846faacbb864ff
MD5 03da794e8ca828c82dda49b9d0fa028c
BLAKE2b-256 60b908206e96e4b39fb8a5343613cc764c1f0bf026bb38c66252a9fdacc4dd28

See more details on using hashes here.

File details

Details for the file numpack-0.4.5-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for numpack-0.4.5-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d940c8dadb81bdc0d8b98bae638224a2f6b02c9af021a9b6aa31b8b9c1052b8e
MD5 2e9043c72ef718a1d7a043550420b7f1
BLAKE2b-256 3df4578c0ff34214eb7ce83509f7faedf21e9a6cbd854d738a7cf84f123cefb4

See more details on using hashes here.

File details

Details for the file numpack-0.4.5-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: numpack-0.4.5-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 651.6 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.11

File hashes

Hashes for numpack-0.4.5-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 69261fb85c76388c01203ed8409ef18a55bfb57a21bac5cc7263d879845c56bd
MD5 416762e30a71d4c7e535a1f6035392ed
BLAKE2b-256 67903ce80e923d78e3338426f2d5442298df7174eb7ddbad1149fd5186b986bc

See more details on using hashes here.

File details

Details for the file numpack-0.4.5-cp311-cp311-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for numpack-0.4.5-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 8134acf51bbeaf5a08db0ec8cb2713bcb3a7a72a8d280827a3d344b86b3f9728
MD5 2a97689c90c58813027bd5b47b514884
BLAKE2b-256 4067d279d923f8bbd3aea27683d3eaf368b296936201e5c75caed824fc34eedf

See more details on using hashes here.

File details

Details for the file numpack-0.4.5-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for numpack-0.4.5-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 466f9aee93316017cf8521ee75436a97c92b1c17c7eb8573b3c4e8ce56297867
MD5 e82944733437a6b743e81203ad1334dc
BLAKE2b-256 8e2339c969eb15e31dd85c6344acc41d15bc12f5a6d6be6c5b3ea347a365e009

See more details on using hashes here.

File details

Details for the file numpack-0.4.5-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: numpack-0.4.5-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 651.8 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.11

File hashes

Hashes for numpack-0.4.5-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 45066aec6ffaa42a2f60d8a8c7ec086bb2d83801dba6d35950573072c0790ffe
MD5 0a74bddec8d919a48f5008eb7b1f2c37
BLAKE2b-256 a88a56722360a93aff99ef5f2fa34965ffeccc63f338ab41bb20ca065eda0a87

See more details on using hashes here.

File details

Details for the file numpack-0.4.5-cp310-cp310-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for numpack-0.4.5-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 971f122667f6e4017dbf30a82d8ba3ac3a5f622f77e3924bb7a355c36dbc33a7
MD5 5b139294a67a964e8422c1a1295a0ff8
BLAKE2b-256 e6adc0e16d99aa4418b98d69cfc177ea76169ddb843eea597ecc0382e702073b

See more details on using hashes here.

File details

Details for the file numpack-0.4.5-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for numpack-0.4.5-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 87cbc42be4906aad86b62febcfb6e9db178ae56ab1af1ebff16c916df3447d2a
MD5 e4755fc3ce4a6156bedb01b025457147
BLAKE2b-256 7949707a74e26a6149d93a533d6ab5a17c81e1d5b45205ea9726812e4058bc7b

See more details on using hashes here.

File details

Details for the file numpack-0.4.5-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: numpack-0.4.5-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 651.8 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.11

File hashes

Hashes for numpack-0.4.5-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 d82882a3d55a8f8f47ab58a14bcc90bd79bc8d58aefa77d90d95013de3067b7d
MD5 dfcd4328d6e725f22f8d4e5087909f40
BLAKE2b-256 3ce0df3833f2e341f3fdd5dea66ad8b67ecb18678be60ecfb0ca65004ec31daf

See more details on using hashes here.

File details

Details for the file numpack-0.4.5-cp39-cp39-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for numpack-0.4.5-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 f4054ce1305393c66bfa4537f05abf7d0c67bf8c9460b3e6465ac6081083cf50
MD5 52fef57002774a89ce18740caf43ebc2
BLAKE2b-256 2c207a1042fd5c8f70f8fc3a2723572bd8a964e30e08cc5f0d0d4a2369021e0e

See more details on using hashes here.

File details

Details for the file numpack-0.4.5-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for numpack-0.4.5-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2404d9b05493d14f37219c5140fccb58f52d4ddcc289c5e60ce58151458e14be
MD5 7948f0abad468eebb9979c9e4f7a2d52
BLAKE2b-256 4cceb3a290cadcd42f9ad3ab655cab03894de16d3909f464b8da6f0d46feb18c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page