numpack


Namenumpack JSON
Version 0.4.3 PyPI version JSON
download
home_pageNone
SummaryA high-performance array storage and manipulation library
upload_time2025-11-03 01:18:21
maintainerNone
docs_urlNone
authorNumPack Contributors
requires_python>=3.9
licenseNone
keywords numpy array storage performance
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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

### 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
- **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

```bash
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](https://rustup.rs/))
- NumPy >= 1.26.0
- Appropriate C/C++ compiler
  - Windows: [Microsoft C++ Build Tools](https://visualstudio.microsoft.com/visual-cpp-build-tools/)
  - macOS: Xcode Command Line Tools (`xcode-select --install`)
  - Linux: GCC/Clang (`build-essential` on Ubuntu/Debian)

#### Build Steps

1. Clone the repository:
```bash
git clone https://github.com/BirchKwok/NumPack.git
cd NumPack
```

2. Install maturin:
```bash
pip install maturin>=1.0,<2.0
```

3. Build and install:
```bash
# Install in development mode
maturin develop

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

## Usage

### Basic Operations

```python
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

```python
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)

```python
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)

```python
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
```

## 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

⚠️ **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

```python
# 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

```python
# 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

```python
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

```python
# ✅ 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')
```

## 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.


            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "numpack",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": "numpy, array, storage, performance",
    "author": "NumPack Contributors",
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/60/e1/20a3b043cf2b2d7aaf56547650f578d5cdcd45392545badf86921254657a/numpack-0.4.3.tar.gz",
    "platform": null,
    "description": "# NumPack\n\nNumPack 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.\n\n## Key Features\n\n- \ud83d\ude80 **321x faster** row replacement than NPY\n- \u26a1 **224x faster** data append than NPY  \n- \ud83d\udca8 **45x faster** lazy loading than NPY mmap\n- \ud83d\udcd6 **1.58x faster** full data loading than NPY \u2b06\ufe0f\n- \ud83c\udfaf **Random Access**: 1K indices 2.4x slower, 10K indices 16.4x slower than NPY \u26a0\ufe0f\n- \ud83d\udd04 **20.4x speedup** with Batch Mode for frequent modifications\n- \u26a1 **94.8x speedup** with Writable Batch Mode \u2b06\ufe0f\n- \ud83d\udcbe Zero-copy operations with minimal memory footprint\n- \ud83d\udee0 Seamless integration with existing NumPy workflows\n\n### New I/O Optimizations \ud83d\udd27\n\n1. **Adaptive Buffer Sizing**\n   - Small arrays (<1MB): 256KB buffer \u2192 96% memory saving\n   - Medium arrays (1-10MB): 4MB buffer \u2192 balanced performance\n   - Large arrays (>10MB): 16MB buffer \u2192 maximum throughput\n\n2. **Smart Parallelization**\n   - Automatically parallelizes only when beneficial (>10MB total data)\n   - Avoids thread overhead for small datasets\n\n3. **Fast Overwrite Path**\n   - Same-shape array overwrite: 1.5-2.5x faster\n   - Uses in-place update instead of file recreation\n\n4. **SIMD Acceleration**\n   - Large files (>10MB) use SIMD-optimized operations\n   - Theoretical 2-4x speedup for memory-intensive operations\n\n5. **Batch Mode Intelligence**\n   - Smart dirty tracking: only flushes modified arrays\n   - Zero-copy cache detection\n   - Reduced metadata synchronization\n\n### Core Advantages Enhanced\n\n- Replace operations now **321x faster** than NPY \ud83d\udd25\n- Full Load now **1.58x faster** than NPY \ud83d\udcc8\n- System-wide optimizations benefit all operation modes\n\n## Features\n\n- **High Performance**: Optimized for both reading and writing large numerical arrays\n- **Lazy Loading Support**: Efficient memory usage through on-demand data loading\n- **In-place Operations**: Support for in-place array modifications without full file rewrite\n- **Batch Processing Modes**: \n  - Batch Mode: 21x speedup for batch operations\n  - Writable Batch Mode: 89x speedup for frequent modifications\n- **Multiple Data Types**: Supports various numerical data types including:\n  - Boolean\n  - Unsigned integers (8-bit to 64-bit)\n  - Signed integers (8-bit to 64-bit)\n  - Floating point (16-bit, 32-bit and 64-bit)\n  - Complex numbers (64-bit and 128-bit)\n\n## Installation\n\n### From PyPI (Recommended)\n\n#### Prerequisites\n- Python >= 3.9\n- NumPy >= 1.26.0\n\n```bash\npip install numpack\n```\n\n### From Source\n\n#### Prerequisites (All Platforms including Windows)\n\n- Python >= 3.9\n- **Rust >= 1.70.0** (Required on all platforms, install from [rustup.rs](https://rustup.rs/))\n- NumPy >= 1.26.0\n- Appropriate C/C++ compiler\n  - Windows: [Microsoft C++ Build Tools](https://visualstudio.microsoft.com/visual-cpp-build-tools/)\n  - macOS: Xcode Command Line Tools (`xcode-select --install`)\n  - Linux: GCC/Clang (`build-essential` on Ubuntu/Debian)\n\n#### Build Steps\n\n1. Clone the repository:\n```bash\ngit clone https://github.com/BirchKwok/NumPack.git\ncd NumPack\n```\n\n2. Install maturin:\n```bash\npip install maturin>=1.0,<2.0\n```\n\n3. Build and install:\n```bash\n# Install in development mode\nmaturin develop\n\n# Or build wheel package\nmaturin build --release\npip install target/wheels/numpack-*.whl\n```\n\n## Usage\n\n### Basic Operations\n\n```python\nimport numpy as np\nfrom numpack import NumPack\n\n# Using context manager (Recommended)\nwith NumPack(\"data_directory\") as npk:\n    # Save arrays\n    arrays = {\n        'array1': np.random.rand(1000, 100).astype(np.float32),\n        'array2': np.random.rand(500, 200).astype(np.float32)\n    }\n    npk.save(arrays)\n    \n    # Load arrays - Normal mode\n    loaded = npk.load(\"array1\")\n    \n    # Load arrays - Lazy mode\n    lazy_array = npk.load(\"array1\", lazy=True)\n```\n\n### Advanced Operations\n\n```python\nwith NumPack(\"data_directory\") as npk:\n    # Replace specific rows\n    replacement = np.random.rand(10, 100).astype(np.float32)\n    npk.replace({'array1': replacement}, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])\n    \n    # Append new data\n    new_data = {'array1': np.random.rand(100, 100).astype(np.float32)}\n    npk.append(new_data)\n    \n    # Drop arrays or specific rows\n    npk.drop('array1')  # Drop entire array\n    npk.drop('array2', [0, 1, 2])  # Drop specific rows\n    \n    # Random access operations\n    data = npk.getitem('array1', [0, 1, 2])\n    data = npk['array1']  # Dictionary-style access\n    \n    # Stream loading for large arrays\n    for batch in npk.stream_load('array1', buffer_size=1000):\n        process_batch(batch)\n```\n\n### Batch Processing Modes\n\nNumPack provides two high-performance batch modes for scenarios with frequent modifications:\n\n#### Batch Mode (21x speedup, 43% faster than before)\n\n```python\nwith NumPack(\"data.npk\") as npk:\n    with npk.batch_mode():\n        for i in range(1000):\n            arr = npk.load('data')      # Load from cache\n            arr[:10] *= 2.0\n            npk.save({'data': arr})     # Save to cache\n# All changes written to disk on exit\n# \u2728 Now with smart dirty tracking and zero-copy detection\n```\n\n#### Writable Batch Mode (89x speedup)\n\n```python\nwith NumPack(\"data.npk\") as npk:\n    with npk.writable_batch_mode() as wb:\n        for i in range(1000):\n            arr = wb.load('data')   # Memory-mapped view\n            arr[:10] *= 2.0         # Direct modification\n            # No save needed - changes are automatic\n```\n\n## Performance\n\nAll benchmarks were conducted on macOS (Apple Silicon) using the Rust backend with precise timeit measurements.\n\n### Performance Comparison (1M rows \u00d7 10 columns, Float32, 38.1MB)\n\n| Operation | NumPack | NPY | NPZ | Zarr | HDF5 | NumPack Advantage |\n|-----------|---------|-----|-----|------|------|-------------------|\n| **Full Load** | **4.11ms** \ud83e\udd47 | 6.48ms | 168.33ms | 34.29ms | 50.59ms | **1.58x vs NPY** \u2b06\ufe0f |\n| **Lazy Load** | **0.002ms** \ud83e\udd47 | 0.091ms | N/A | 0.405ms | 0.078ms | **45x vs NPY** |\n| **Replace 100 rows** | **0.042ms** \ud83e\udd47 | 13.49ms | 1514ms | 7.68ms | 0.33ms | **321x vs NPY** \ud83d\udd25 |\n| **Append 100 rows** | **0.091ms** \ud83e\udd47 | 20.40ms | 1522ms | 9.15ms | 0.20ms | **224x vs NPY** |\n| **Save** | 12.73ms | **6.53ms** \ud83e\udd47 | 1343ms | 74.02ms | 56.32ms | 1.95x slower |\n\n#### Random Access Performance\n\n| Batch Size | NumPack | NPY (actual read) | NPZ | Zarr | HDF5 | NumPack Advantage |\n|------------|---------|---------------|-----|------|------|-------------------|\n| **100 indices** | 0.038ms | **0.002ms** \ud83e\udd47 | 169.54ms | 2.88ms | 0.58ms | 15.4x slower |\n| **1K indices** | 0.060ms | **0.025ms** \ud83e\udd47 | 169.04ms | 3.25ms | 4.53ms | 2.4x slower \u2705 |\n| **10K indices** | 1.53ms | **0.093ms** \ud83e\udd47 | 169.80ms | 17.94ms | 511.16ms | 16.4x slower \u26a0\ufe0f |\n\n#### Sequential Access Performance\n\n| Batch Size | NumPack | NPY (actual read) | NPZ | Zarr | HDF5 | NumPack Advantage |\n|------------|---------|---------------|-----|------|------|-------------------|\n| **100 rows** | 0.030ms | **0.001ms** \ud83e\udd47 | 169.85ms | 2.68ms | 0.13ms | 28.5x slower |\n| **1K rows** | 0.049ms | **0.002ms** \ud83e\udd47 | 169.52ms | 2.94ms | 0.17ms | 29.7x slower |\n| **10K rows** | 0.321ms | **0.008ms** \ud83e\udd47 | 169.17ms | 3.05ms | 0.78ms | 41.2x slower |\n\n### Performance Comparison (100K rows \u00d7 10 columns, Float32, 3.8MB)\n\n| Operation | NumPack | NPY | NPZ | Zarr | HDF5 | NumPack Advantage |\n|-----------|---------|-----|-----|------|------|-------------------|\n| **Full Load** | **0.326ms** \ud83e\udd47 | 0.405ms | 17.27ms | 4.96ms | 5.60ms | **1.24x vs NPY** |\n| **Lazy Load** | **0.003ms** \ud83e\udd47 | 0.094ms | N/A | 0.390ms | 0.086ms | **37x vs NPY** |\n| **Replace 100 rows** | **0.031ms** \ud83e\udd47 | 1.21ms | 153.05ms | 3.87ms | 0.31ms | **39x vs NPY** |\n| **Append 100 rows** | **0.058ms** \ud83e\udd47 | 1.83ms | 153.47ms | 4.13ms | 0.21ms | **32x vs NPY** |\n\n#### Random Access Performance\n\n| Batch Size | NumPack | NPY (actual read) | NPZ | Zarr | HDF5 | NumPack Advantage |\n|------------|---------|---------------|-----|------|------|-------------------|\n| **100 indices** | 0.032ms | **0.002ms** \ud83e\udd47 | 17.38ms | 1.31ms | 0.58ms | 13.0x slower |\n| **1K indices** | 0.057ms | **0.019ms** \ud83e\udd47 | 17.36ms | 1.63ms | 4.79ms | 3.0x slower \u2705 |\n| **10K indices** | 0.274ms | **0.125ms** \ud83e\udd47 | 17.38ms | 4.81ms | 163.58ms | 2.2x slower \u2705 |\n\n#### Sequential Access Performance\n\n| Batch Size | NumPack | NPY (actual read) | NPZ | Zarr | HDF5 | NumPack Advantage |\n|------------|---------|---------------|-----|------|------|-------------------|\n| **100 rows** | 0.019ms | **0.001ms** \ud83e\udd47 | 17.24ms | 1.24ms | 0.12ms | 17.5x slower |\n| **1K rows** | 0.036ms | **0.002ms** \ud83e\udd47 | 17.23ms | 1.37ms | 0.16ms | 20.2x slower |\n| **10K rows** | 0.264ms | **0.008ms** \ud83e\udd47 | 17.34ms | 1.48ms | 0.63ms | 33.8x slower |\n\n### Batch Mode Performance (1M rows \u00d7 10 columns)\n\n100 consecutive modify operations:\n\n| Mode | Time | Speedup vs Normal |\n|------|------|-------------------|\n| Normal Mode | **418ms** | - |\n| **Batch Mode** | **20.5ms** | **20.4x faster** \ud83d\udd25 |\n| **Writable Batch Mode** | **4.4ms** | **94.8x faster** \ud83d\udd25 |\n\n\ud83d\udca1 **Note:** All modes benefit from I/O optimizations. Speedup ratios are calculated against Normal Mode baseline.\n\n### Key Performance Highlights\n\n1. **Data Modification - Exceptional Performance** \ud83c\udfc6\n   - Replace operations: **321x faster** than NPY \ud83d\udd25\n   - Append operations: **224x faster** than NPY (large dataset)\n   - Supports efficient in-place modification without full file rewrite\n   - NumPack's core advantage for write-heavy workloads\n\n2. **Data Loading - Outstanding Performance** \u2b50 **Enhanced**\n   - Full load: **1.58x faster** than NPY (4.11ms vs 6.48ms) \u2b06\ufe0f\n   - Lazy load: **45x faster** than NPY mmap (0.002ms vs 0.091ms)\n   - Optimized with adaptive buffering and SIMD acceleration\n\n3. **Batch Processing - Excellent Performance** \u2b50 **Strong**\n   - Batch Mode: **20.4x speedup** (20.5ms vs 418ms normal mode)\n   - Writable Batch Mode: **94.8x speedup** (4.4ms) \u2b06\ufe0f\n   - System-wide I/O optimizations benefit all modes\n\n4. **Sequential Access** \ud83d\udcca\n   - Small batch (100 rows): 17.5x slower than NPY (0.019ms vs 0.001ms)\n   - Medium batch (1K rows): 20.2x slower (0.036ms vs 0.002ms)  \n   - Large batch (10K rows): 33.8x slower (0.264ms vs 0.008ms)\n   - Still significantly faster than all other formats (Zarr: 3.05ms, HDF5: 0.78ms, NPZ: 169ms)\n   - **Note:** Tests use real data reads; NPY mmap view-only is faster but not practical\n\n5. **Random Access - Significantly Improved** \ud83d\udd25 **Major Enhancement**\n   - Small batch (100 indices): 15.4x slower (0.038ms vs 0.002ms)\n   - Medium batch (1K indices): **2.4x slower** (0.060ms vs 0.025ms) \u2705 **Improved from 397x!**\n   - Large batch (10K indices): 16.4x slower (1.53ms vs 0.093ms) - affected by page faults \u26a0\ufe0f\n   - **However**: NumPack still **334x faster** than HDF5 for 10K random access (1.53ms vs 511ms)\n   - **Key trade-off**: NPY excels at random read BUT 321x slower on writes\n   - For mixed read-write workloads, NumPack offers better overall balance\n\n6. **Storage Efficiency**\n   - File size identical to NPY (38.15MB)\n   - ~10% smaller than Zarr/NPZ (compressed formats)\n\n\n### When to Use NumPack\n\n\u2705 **Strongly Recommended** (85% of use cases):\n- Machine learning and deep learning pipelines\n- Real-time data stream processing\n- Data annotation and correction workflows\n- Feature stores with dynamic updates\n- **Any scenario requiring frequent data modifications** (321x faster writes!)\n- Fast data loading requirements (1.58x faster than NPY)\n- Balanced read-write workloads\n- Sequential data processing workflows\n\n\u26a0\ufe0f **Consider Alternatives** (15% of use cases):\n- Write-once, never modify \u2192 Use NPY (1.95x faster write, but 321x slower for updates)\n- **Frequent random access** \u2192 Use NPY (2.4x-16x faster for random reads)\n- Pure read-only with heavy sequential access \u2192 Use NPY mmap (20-41x faster)\n- Extreme compression requirements \u2192 Use NPZ (10% smaller, but 1000x slower)\n\n\ud83d\udca1 **Performance Trade-offs & Insights**:\n- **Write operations**: NumPack dominant (321x faster replacements, 224x faster appends)\n- **Read operations**: NPY faster for random/sequential access (2.4x-41x), especially for small batches\n- **Major improvement**: 1K random access improved from 397x to 2.4x slower \u2b06\ufe0f\n- **Overall balance**: NumPack excels in mixed read-write workloads\n- For pure read-heavy (>95% reads), NPY may be better\n- For write-intensive or balanced workloads (>5% writes), NumPack is superior\n- **Key insight**: Tests use real data reads; NPY mmap view-only is faster but not practical\n\n## Best Practices\n\n### 1. Use Writable Batch Mode for Frequent Modifications\n\n```python\n# 94.8x speedup for frequent modifications\nwith NumPack(\"data.npk\") as npk:\n    with npk.writable_batch_mode() as wb:\n        for i in range(1000):\n            arr = wb.load('data')\n            arr[:10] *= 2.0\n# Automatic persistence on exit\n```\n\n### 2. Use Batch Mode for Batch Operations\n\n```python\n# 20.4x speedup for batch processing\nwith NumPack(\"data.npk\") as npk:\n    with npk.batch_mode():\n        for i in range(1000):\n            arr = npk.load('data')\n            arr[:10] *= 2.0\n            npk.save({'data': arr})\n# Single write on exit with smart dirty tracking\n```\n\n### 3. Use Lazy Loading for Large Datasets\n\n```python\nwith NumPack(\"large_data.npk\") as npk:\n    # Only 0.002ms to initialize\n    lazy_array = npk.load(\"array\", lazy=True)\n    # Data loaded on demand\n    subset = lazy_array[1000:2000]\n```\n\n### 4. Reuse NumPack Instances\n\n```python\n# \u2705 Efficient: Reuse instance\nwith NumPack(\"data.npk\") as npk:\n    for i in range(100):\n        data = npk.load('array')\n\n# \u274c Inefficient: Create new instance each time\nfor i in range(100):\n    with NumPack(\"data.npk\") as npk:\n        data = npk.load('array')\n```\n\n## Benchmark Methodology\n\nAll benchmarks use:\n- `timeit` for precise timing\n- Multiple repeats, best time selected\n- Pure operation time (excluding file open/close overhead)\n- Float32 arrays\n- macOS Apple Silicon (results may vary by platform)\n- Comprehensive testing across multiple formats (NPY, NPZ, Zarr, HDF5, Parquet, Arrow/Feather)\n\n**New in this version**: \n- Added random access and sequential access benchmarks across different batch sizes (100, 1K, 10K)\n- **Important**: NPY mmap tests force actual data reads using `np.array()` conversion, not just view creation\n  - This provides fair comparison as NumPack returns actual data\n  - Mmap view-only access is faster but not practical for real workloads\n  - Results reflect real-world performance when data is actually used\n\nFor complete benchmark code, see `unified_benchmark.py`.\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n## License\n\nThis project is licensed under the Apache License, Version 2.0 - see the LICENSE file for details.\n\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "A high-performance array storage and manipulation library",
    "version": "0.4.3",
    "project_urls": null,
    "split_keywords": [
        "numpy",
        " array",
        " storage",
        " performance"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "aa5f3f58c58cb0f59f762fa2329fc260023655f030caa0be6e2f992756f2e2dd",
                "md5": "b598511bdff7555f78d0424ca56e7da7",
                "sha256": "fde4a528d15ca7421b18283caa2325e132272faa8d270eb2cd07c2e86c456f13"
            },
            "downloads": -1,
            "filename": "numpack-0.4.3-cp310-cp310-macosx_10_12_x86_64.whl",
            "has_sig": false,
            "md5_digest": "b598511bdff7555f78d0424ca56e7da7",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 598380,
            "upload_time": "2025-11-03T01:17:54",
            "upload_time_iso_8601": "2025-11-03T01:17:54.121110Z",
            "url": "https://files.pythonhosted.org/packages/aa/5f/3f58c58cb0f59f762fa2329fc260023655f030caa0be6e2f992756f2e2dd/numpack-0.4.3-cp310-cp310-macosx_10_12_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e969c04268d5633e16057165f57e115c1d052f00d97f4e8937613715ec42bf6b",
                "md5": "7bb5e13d94561b766cc659bf6bf99ac6",
                "sha256": "a0f4eda05321666f082ffe6bdde787698bbdff136b9a82185f6bc9db14654590"
            },
            "downloads": -1,
            "filename": "numpack-0.4.3-cp310-cp310-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "7bb5e13d94561b766cc659bf6bf99ac6",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 536847,
            "upload_time": "2025-11-03T01:17:55",
            "upload_time_iso_8601": "2025-11-03T01:17:55.475363Z",
            "url": "https://files.pythonhosted.org/packages/e9/69/c04268d5633e16057165f57e115c1d052f00d97f4e8937613715ec42bf6b/numpack-0.4.3-cp310-cp310-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "01ed2937b6756bf8cfde621ccae5e11aaf1352abb016de769e8a63971ed7e829",
                "md5": "213716da02ae8a3495b03271a1b7006a",
                "sha256": "9395a91add5c5e270a6e2688d6640b56b95f29d022938514f7e3da396db76aa8"
            },
            "downloads": -1,
            "filename": "numpack-0.4.3-cp310-cp310-manylinux_2_34_x86_64.whl",
            "has_sig": false,
            "md5_digest": "213716da02ae8a3495b03271a1b7006a",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 628418,
            "upload_time": "2025-11-03T01:17:56",
            "upload_time_iso_8601": "2025-11-03T01:17:56.647381Z",
            "url": "https://files.pythonhosted.org/packages/01/ed/2937b6756bf8cfde621ccae5e11aaf1352abb016de769e8a63971ed7e829/numpack-0.4.3-cp310-cp310-manylinux_2_34_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "0f90e3bef07c83e313099640addc2ecae7d9916e4e9ac64b81bbd4d7e79ce533",
                "md5": "18c85251d9c34a2810e72d84e78ac839",
                "sha256": "2fcc167ff846b9f7a9db3e37254a5acc813222690db26d4b6787d72d46e2e65e"
            },
            "downloads": -1,
            "filename": "numpack-0.4.3-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "18c85251d9c34a2810e72d84e78ac839",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 503636,
            "upload_time": "2025-11-03T01:17:57",
            "upload_time_iso_8601": "2025-11-03T01:17:57.664848Z",
            "url": "https://files.pythonhosted.org/packages/0f/90/e3bef07c83e313099640addc2ecae7d9916e4e9ac64b81bbd4d7e79ce533/numpack-0.4.3-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "49caa53b88ce20724556e93177f91ff74aca2b40f539924865bf830fc4c57e40",
                "md5": "94c5c20e8107f2ae35f50d1a04d7226e",
                "sha256": "3af3e2e3a62cbdbaa63cdfdb4c5f4bb2772a272f1bd39c346225d6a8a581462a"
            },
            "downloads": -1,
            "filename": "numpack-0.4.3-cp311-cp311-macosx_10_12_x86_64.whl",
            "has_sig": false,
            "md5_digest": "94c5c20e8107f2ae35f50d1a04d7226e",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 598192,
            "upload_time": "2025-11-03T01:17:59",
            "upload_time_iso_8601": "2025-11-03T01:17:59.019761Z",
            "url": "https://files.pythonhosted.org/packages/49/ca/a53b88ce20724556e93177f91ff74aca2b40f539924865bf830fc4c57e40/numpack-0.4.3-cp311-cp311-macosx_10_12_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b689eef54b1c4ce15b100d214dae9f153de5d8a38bb0b6f17e886c477ea34373",
                "md5": "aba0350c4605c98ca89364df0cf69d03",
                "sha256": "084c66bc89b7a730927ac82c83f981f729c44aeb70f8c5850859e3cc78f97aa3"
            },
            "downloads": -1,
            "filename": "numpack-0.4.3-cp311-cp311-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "aba0350c4605c98ca89364df0cf69d03",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 536658,
            "upload_time": "2025-11-03T01:18:00",
            "upload_time_iso_8601": "2025-11-03T01:18:00.364204Z",
            "url": "https://files.pythonhosted.org/packages/b6/89/eef54b1c4ce15b100d214dae9f153de5d8a38bb0b6f17e886c477ea34373/numpack-0.4.3-cp311-cp311-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "cf4efa8eb05f29fffa16c689c298c04589fb8d626c2cb46be50bdbd8f20b5477",
                "md5": "e144c3e481dcb2ec02d7af1b8ceadf05",
                "sha256": "cbc0255e731974ff5655d7864c644a619cc9fac1a05622ac4ce345a1841556c8"
            },
            "downloads": -1,
            "filename": "numpack-0.4.3-cp311-cp311-manylinux_2_34_x86_64.whl",
            "has_sig": false,
            "md5_digest": "e144c3e481dcb2ec02d7af1b8ceadf05",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 628162,
            "upload_time": "2025-11-03T01:18:01",
            "upload_time_iso_8601": "2025-11-03T01:18:01.711922Z",
            "url": "https://files.pythonhosted.org/packages/cf/4e/fa8eb05f29fffa16c689c298c04589fb8d626c2cb46be50bdbd8f20b5477/numpack-0.4.3-cp311-cp311-manylinux_2_34_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "c3a326525ec6dcc8354dd53b13b6fe55a69f66d87f577117e6de4664de6dfd6e",
                "md5": "eae8ca395f39c3e977926578c6792e89",
                "sha256": "400622ffc56b1a65af6b4ab6faa0ba283fcc75f9c4460ab3d407c183857c7245"
            },
            "downloads": -1,
            "filename": "numpack-0.4.3-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "eae8ca395f39c3e977926578c6792e89",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 503485,
            "upload_time": "2025-11-03T01:18:02",
            "upload_time_iso_8601": "2025-11-03T01:18:02.987139Z",
            "url": "https://files.pythonhosted.org/packages/c3/a3/26525ec6dcc8354dd53b13b6fe55a69f66d87f577117e6de4664de6dfd6e/numpack-0.4.3-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "70acd99abb5dbd333954b5aab291fcf37c1be2b02ed9188fbb17b50b4447ee23",
                "md5": "3b3c6afb5ddd9b1ad792368eb52c7d50",
                "sha256": "60e690919fc5508e3c417f0886dbf9bd7124573d7f18ede3b891eb6eb374511a"
            },
            "downloads": -1,
            "filename": "numpack-0.4.3-cp312-cp312-macosx_10_12_x86_64.whl",
            "has_sig": false,
            "md5_digest": "3b3c6afb5ddd9b1ad792368eb52c7d50",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 598385,
            "upload_time": "2025-11-03T01:18:04",
            "upload_time_iso_8601": "2025-11-03T01:18:04.432722Z",
            "url": "https://files.pythonhosted.org/packages/70/ac/d99abb5dbd333954b5aab291fcf37c1be2b02ed9188fbb17b50b4447ee23/numpack-0.4.3-cp312-cp312-macosx_10_12_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "7b88fd4ad50585e2787b6a0e7b22069f5e365504030ae614bf217c355443d7b4",
                "md5": "ac2d3705a630d31990c25b38ea87dd18",
                "sha256": "ce523b9063f013570c8652a28a4bb3a59d4e285f0897614441234499066df932"
            },
            "downloads": -1,
            "filename": "numpack-0.4.3-cp312-cp312-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "ac2d3705a630d31990c25b38ea87dd18",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 534910,
            "upload_time": "2025-11-03T01:18:05",
            "upload_time_iso_8601": "2025-11-03T01:18:05.744409Z",
            "url": "https://files.pythonhosted.org/packages/7b/88/fd4ad50585e2787b6a0e7b22069f5e365504030ae614bf217c355443d7b4/numpack-0.4.3-cp312-cp312-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "304b339be76b547da6edd1bc3b715972614b219f962c4bf9d3ab0a11d786e482",
                "md5": "1a461718ee0b8cb671953bf816b24a36",
                "sha256": "25dd34376bd2555591c79591862c5d0ed67a0560ce3524ece8b74014d0f6ba7b"
            },
            "downloads": -1,
            "filename": "numpack-0.4.3-cp312-cp312-manylinux_2_34_x86_64.whl",
            "has_sig": false,
            "md5_digest": "1a461718ee0b8cb671953bf816b24a36",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 626783,
            "upload_time": "2025-11-03T01:18:06",
            "upload_time_iso_8601": "2025-11-03T01:18:06.813539Z",
            "url": "https://files.pythonhosted.org/packages/30/4b/339be76b547da6edd1bc3b715972614b219f962c4bf9d3ab0a11d786e482/numpack-0.4.3-cp312-cp312-manylinux_2_34_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "5981a661a75b51ae17f72d2fc29c79b41a92f13203789159ed744cee2177fe3a",
                "md5": "89a5c84bfde1410243885d79478d2a05",
                "sha256": "fbc0adf7cf174866de417aff2de222755ca87ecd79f3fcfa5755b158a3f1f3be"
            },
            "downloads": -1,
            "filename": "numpack-0.4.3-cp312-cp312-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "89a5c84bfde1410243885d79478d2a05",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 502471,
            "upload_time": "2025-11-03T01:18:07",
            "upload_time_iso_8601": "2025-11-03T01:18:07.980047Z",
            "url": "https://files.pythonhosted.org/packages/59/81/a661a75b51ae17f72d2fc29c79b41a92f13203789159ed744cee2177fe3a/numpack-0.4.3-cp312-cp312-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "bdda9621e5c18df7c2fc00f096cdf1f107bfd5faac4f978c625e870f3d3a05ac",
                "md5": "cd336baa3e6b4a84f57ea55e5f8d3e51",
                "sha256": "94d5fb8c3b9e12c1c8730278586bbad0ded5d3ad2ae710096822729438db8590"
            },
            "downloads": -1,
            "filename": "numpack-0.4.3-cp313-cp313-macosx_10_12_x86_64.whl",
            "has_sig": false,
            "md5_digest": "cd336baa3e6b4a84f57ea55e5f8d3e51",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.9",
            "size": 598103,
            "upload_time": "2025-11-03T01:18:09",
            "upload_time_iso_8601": "2025-11-03T01:18:09.111902Z",
            "url": "https://files.pythonhosted.org/packages/bd/da/9621e5c18df7c2fc00f096cdf1f107bfd5faac4f978c625e870f3d3a05ac/numpack-0.4.3-cp313-cp313-macosx_10_12_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "958cd93f490469921343da88e76f535d599884463fdcf57cf5d518219d23c7da",
                "md5": "8c2d0ec2fe8f346677bb7afb3b9788f6",
                "sha256": "c633d2119cf1fe15155c7a5d5c97523389e8b46d5d28e79ef7dc2caf83d6488d"
            },
            "downloads": -1,
            "filename": "numpack-0.4.3-cp313-cp313-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "8c2d0ec2fe8f346677bb7afb3b9788f6",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.9",
            "size": 534460,
            "upload_time": "2025-11-03T01:18:10",
            "upload_time_iso_8601": "2025-11-03T01:18:10.449027Z",
            "url": "https://files.pythonhosted.org/packages/95/8c/d93f490469921343da88e76f535d599884463fdcf57cf5d518219d23c7da/numpack-0.4.3-cp313-cp313-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "7a4fece78ee21d001d19e0324d784a01eaa72830f9740bd8bcacc8a66e389b77",
                "md5": "f421db06d8fca5a074491174f1365718",
                "sha256": "c34d7598e24e1e0591da246a931bb4b6716aabeff5db8cabfc5fb2bc6adea5fa"
            },
            "downloads": -1,
            "filename": "numpack-0.4.3-cp313-cp313-manylinux_2_34_x86_64.whl",
            "has_sig": false,
            "md5_digest": "f421db06d8fca5a074491174f1365718",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.9",
            "size": 626378,
            "upload_time": "2025-11-03T01:18:11",
            "upload_time_iso_8601": "2025-11-03T01:18:11.791006Z",
            "url": "https://files.pythonhosted.org/packages/7a/4f/ece78ee21d001d19e0324d784a01eaa72830f9740bd8bcacc8a66e389b77/numpack-0.4.3-cp313-cp313-manylinux_2_34_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "dd8baa11d34becbc2c09aef0ba5faff0e745b98f1c18324ae971f7607890177f",
                "md5": "7c09dfc2c559b1f1d22c889e5ed38357",
                "sha256": "b2e7d0cb1f11668f8b43dcc04f410a3716ed61a2a449f85d5e3ed2e7c9373f5f"
            },
            "downloads": -1,
            "filename": "numpack-0.4.3-cp313-cp313-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "7c09dfc2c559b1f1d22c889e5ed38357",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.9",
            "size": 502129,
            "upload_time": "2025-11-03T01:18:13",
            "upload_time_iso_8601": "2025-11-03T01:18:13.035634Z",
            "url": "https://files.pythonhosted.org/packages/dd/8b/aa11d34becbc2c09aef0ba5faff0e745b98f1c18324ae971f7607890177f/numpack-0.4.3-cp313-cp313-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "be3ecc3e565d00c5e165ef63271e271fe3d7975599a93ed1294b3074b49b2d89",
                "md5": "e6de2c699f5349219ecc6eb84f6d3474",
                "sha256": "72d6a347b3ffe079045a3af12da917e440835c92feb2050ab71c28d397f0b8a0"
            },
            "downloads": -1,
            "filename": "numpack-0.4.3-cp314-cp314-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "e6de2c699f5349219ecc6eb84f6d3474",
            "packagetype": "bdist_wheel",
            "python_version": "cp314",
            "requires_python": ">=3.9",
            "size": 541600,
            "upload_time": "2025-11-03T01:18:14",
            "upload_time_iso_8601": "2025-11-03T01:18:14.027336Z",
            "url": "https://files.pythonhosted.org/packages/be/3e/cc3e565d00c5e165ef63271e271fe3d7975599a93ed1294b3074b49b2d89/numpack-0.4.3-cp314-cp314-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f75fe8b4ba0d6446dd024dadd1496ad586ae55e7f5a69249cb0bc0bb801a7d74",
                "md5": "3b24f7ee6f2131eb4ff1c3c485e42a87",
                "sha256": "f70bfd7286a77053f10927e8e30060e9924be4d2bf4a7c4739536f24cee022ce"
            },
            "downloads": -1,
            "filename": "numpack-0.4.3-cp314-cp314-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "3b24f7ee6f2131eb4ff1c3c485e42a87",
            "packagetype": "bdist_wheel",
            "python_version": "cp314",
            "requires_python": ">=3.9",
            "size": 510615,
            "upload_time": "2025-11-03T01:18:14",
            "upload_time_iso_8601": "2025-11-03T01:18:14.999809Z",
            "url": "https://files.pythonhosted.org/packages/f7/5f/e8b4ba0d6446dd024dadd1496ad586ae55e7f5a69249cb0bc0bb801a7d74/numpack-0.4.3-cp314-cp314-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "d52c14e5bfea11b3fb17a1373e6ed57cb3fd89458b258b8c5d4466f97dd8edc2",
                "md5": "64b3ab8f126343294f66ac23917b64d7",
                "sha256": "48861121ee2e325836c90d81421445e3f7a76015eac35e11a75ef09235bcaf64"
            },
            "downloads": -1,
            "filename": "numpack-0.4.3-cp39-cp39-macosx_10_12_x86_64.whl",
            "has_sig": false,
            "md5_digest": "64b3ab8f126343294f66ac23917b64d7",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 598488,
            "upload_time": "2025-11-03T01:18:16",
            "upload_time_iso_8601": "2025-11-03T01:18:16.301649Z",
            "url": "https://files.pythonhosted.org/packages/d5/2c/14e5bfea11b3fb17a1373e6ed57cb3fd89458b258b8c5d4466f97dd8edc2/numpack-0.4.3-cp39-cp39-macosx_10_12_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "65118ab4b5799710e9046a773ac755374dd78afe1850b67883cb268ceea6c04a",
                "md5": "3f0ab372b42b12db5fbfbaa65b4d77dd",
                "sha256": "212ca36d8a951ecfb22514f2fd23dce587e9ffbaef38c8d991559a0ab0aeff55"
            },
            "downloads": -1,
            "filename": "numpack-0.4.3-cp39-cp39-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "3f0ab372b42b12db5fbfbaa65b4d77dd",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 536970,
            "upload_time": "2025-11-03T01:18:17",
            "upload_time_iso_8601": "2025-11-03T01:18:17.392033Z",
            "url": "https://files.pythonhosted.org/packages/65/11/8ab4b5799710e9046a773ac755374dd78afe1850b67883cb268ceea6c04a/numpack-0.4.3-cp39-cp39-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "7357efcfad5f63f2d2155b997f139fc3cfa3550103ccf6148b9b280a7a55995d",
                "md5": "7e10b819c40a2f1487b42248aa049907",
                "sha256": "52b7e76493a1909fe9d168157d406b3fa3e287927f75153004cc8b755f9b5399"
            },
            "downloads": -1,
            "filename": "numpack-0.4.3-cp39-cp39-manylinux_2_34_x86_64.whl",
            "has_sig": false,
            "md5_digest": "7e10b819c40a2f1487b42248aa049907",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 628616,
            "upload_time": "2025-11-03T01:18:19",
            "upload_time_iso_8601": "2025-11-03T01:18:19.188100Z",
            "url": "https://files.pythonhosted.org/packages/73/57/efcfad5f63f2d2155b997f139fc3cfa3550103ccf6148b9b280a7a55995d/numpack-0.4.3-cp39-cp39-manylinux_2_34_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "5fb7d0699558f2dab3a4a106fb47d1c610a726dd9867b4dffa5f933362ef466e",
                "md5": "07ac8b4a20d907226c5e2cf08c02df35",
                "sha256": "7871fe1e7f2acbc0e11066f205a7b05e77aa109c5eb5e606669dd92d832e830c"
            },
            "downloads": -1,
            "filename": "numpack-0.4.3-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "07ac8b4a20d907226c5e2cf08c02df35",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 503561,
            "upload_time": "2025-11-03T01:18:20",
            "upload_time_iso_8601": "2025-11-03T01:18:20.637366Z",
            "url": "https://files.pythonhosted.org/packages/5f/b7/d0699558f2dab3a4a106fb47d1c610a726dd9867b4dffa5f933362ef466e/numpack-0.4.3-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "60e120a3b043cf2b2d7aaf56547650f578d5cdcd45392545badf86921254657a",
                "md5": "4567781a6a96a19a107492200870e5b7",
                "sha256": "a6b6ec72383ee9ca40e74747dc7ac887ed71beaa3105b8becb478fd80cb33d63"
            },
            "downloads": -1,
            "filename": "numpack-0.4.3.tar.gz",
            "has_sig": false,
            "md5_digest": "4567781a6a96a19a107492200870e5b7",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 327033,
            "upload_time": "2025-11-03T01:18:21",
            "upload_time_iso_8601": "2025-11-03T01:18:21.659136Z",
            "url": "https://files.pythonhosted.org/packages/60/e1/20a3b043cf2b2d7aaf56547650f578d5cdcd45392545badf86921254657a/numpack-0.4.3.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-11-03 01:18:21",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "numpack"
}
        
Elapsed time: 2.03543s