maxheapx


Namemaxheapx JSON
Version 0.1.1 PyPI version JSON
download
home_pageNone
SummaryA max-heap library with an API that mirrors Python's heapq (but max-first).
upload_time2025-08-14 02:02:56
maintainerNone
docs_urlNone
authorTimothy Roch
requires_python>=3.9
licenseNone
keywords heap priority queue max-heap data structures
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # maxheap

A **max-heap** library with an API that mirrors Python’s `heapq`—but **max-first**.
It ships with a fast **C accelerator** (`maxheap._cmaxheap`) and a **pure-Python fallback**.

* Python: 3.9–3.13
* License: MIT
* Package name: `maxheap`

---

## Features

* Functional API: `heapify`, `heappush`, `heappop`, `heappushpop`, `heapreplace`, `peek`, `is_heap`
* OO wrapper: `MaxHeap` with `push/pop/peek/replace/pushpop`
* Optional C extension for speed; pure-Python fallback if unavailable
* Reproducible **microbenchmarks** with CSV output
* Test suite (`pytest`) including property tests

---

## Quickstart (from a fresh clone)

> **Run all commands from the project root** (the folder that contains `pyproject.toml`).

### macOS/Linux (bash/zsh)

```bash
# 0) Verify you're in the repo root
pwd
ls pyproject.toml

# 1) Create a clean virtualenv
python3 -m venv .venv

# 2) Activate it
source .venv/bin/activate

# 3) Confirm it's active & valid
echo "VIRTUAL_ENV=$VIRTUAL_ENV"
test -x .venv/bin/python && echo "venv OK" || echo "venv MISSING"
python -V

# 4) Install in editable mode (builds the C extension)
python -m pip install -U pip setuptools wheel
python -m pip install -e .

# 5) Sanity check the extension is loaded
python - <<'PY'
import maxheap, sys
print("HAVE_CEXT:", getattr(maxheap, "_HAVE_CEXT", None))
print("heapify impl:", maxheap.heapify.__module__)
print("python:", sys.version)
PY
```

Expected:

```
HAVE_CEXT: True
heapify impl: maxheap._cmaxheap
python: 3.13.x (...)
```

If `HAVE_CEXT` is `False`, you’re using the pure-Python fallback.

### Windows (PowerShell)

```powershell
# 0) Verify you're in the repo root
Get-ChildItem pyproject.toml

# 1) Create a venv
py -m venv .venv

# 2) Activate
. .\.venv\Scripts\Activate.ps1

# 3) Install (use -m to ensure the venv's Python)
python -m pip install -U pip setuptools wheel
python -m pip install -e .

# 4) Sanity
python - <<'PY'
import maxheap, sys
print("HAVE_CEXT:", getattr(maxheap, "_HAVE_CEXT", None))
print("heapify impl:", maxheap.heapify.__module__)
print("python:", sys.version)
PY
```

---

## Rebuilding after C changes

Any time you modify `src/maxheap/_cmaxheap.c`, rebuild:

```bash
# inside the activated venv
rm -rf build
python -m pip install -e .
```

---


## Usage

The API mirrors Python’s built-in [`heapq`](https://docs.python.org/3/library/heapq.html) — but instead of a min-heap that requires negating keys for max-first behavior, **`maxheap` stores the largest element at index `0`** and operates directly without the negation overhead.

You can choose between a **functional API** (works on plain lists) and an **OO wrapper** (`MaxHeap` class).

---

### Functional API

```python
import maxheap as heapq  # same API names as heapq

# Start with an empty list
h = []

# Push elements
heapq.heappush(h, 3)
heapq.heappush(h, 10)
heapq.heappush(h, 5)

# Peek at the largest without removing it
heapq.peek(h)             # -> 10

# Pop the largest
heapq.heappop(h)          # -> 10
heapq.peek(h)             # -> 5

# Replace the largest atomically
heapq.heapreplace(h, 4)   # pops max (5), pushes 4 -> returns 5

# Push an element and pop the largest in a single step
heapq.heappushpop(h, 7)   # pushes 7, pops max -> returns 7

# Turn any list into a valid max-heap in place
data = [1, 8, 3, 2]
heapq.heapify(data)       # data is now a valid max-heap
```

**When to use:**

* You want to use the `heapq`-style API but without the min-heap + negation hack.
* You don’t need to subclass or wrap the heap in your own object.

---

### OO wrapper

```python
from maxheap import MaxHeap

# Initialize from iterable
h = MaxHeap([3, 1, 6, 5, 2, 4])

# Push and pop
h.push(10)
h.peek()   # -> 10
h.pop()    # -> 10

# Length and iteration
len(h)     # -> 6
list(h)    # Pops all items in descending order

# Check if a list is a valid max-heap
MaxHeap.is_heap([10, 5, 6, 2])   # True
```

**When to use:**

* You want an object that *owns* its heap data.
* You want utility methods (`peek`, `is_heap`, iteration) with clean semantics.

---

**Tip:** All hot-path operations (`heapify`, `heappush`, `heappop`, `heappushpop`, `heapreplace`) are C-accelerated — so you get **max-heap behavior faster than `heapq` with negation**.

---

## Running the tests

```bash
# ensure venv is active and package is installed
source .venv/bin/activate  # Windows: .venv\Scripts\activate
python -m pip install -e .
python -m pip install -q pytest hypothesis
python -m pytest -q
```

You should see all tests green (`tests/test_maxheap.py`, `tests/test_properties.py`).

---

## Benchmarks

The benchmark compares `maxheap` with a **baseline** using stdlib `heapq` as a max-heap via negation (`-x`).

### Quick run

```bash
python benchmarks/bench_maxheap.py
```

### Larger run + CSV output

```bash
mkdir -p benchmarks
python benchmarks/bench_maxheap.py --n 100000 --repeat 10 --warmup 3 --seed 1 \
  --csv benchmarks/results.csv
head benchmarks/results.csv
```

**CLI flags**

* `--n` (default `10000`) — number of items
* `--repeat` (default `5`) — measured iterations per case
* `--warmup` (default `1`) — warmup runs
* `--seed` (default `1337`) — RNG seed
* `--csv` — write a results CSV

**Benchmarks covered**

* `heappush`
* `heapify`
* `heapify+drain` (heapify then pop all)
* `heappushpop`
* `heapreplace`

**Interpreting output**

Each line prints `min / median / mean`. When a baseline exists (the negation variant), a `%` indicates **median** speedup (positive = faster than baseline).

---

## A/B: Force the pure-Python fallback (optional)

If you want to compare C vs Python on your machine, temporarily let the package respect an env var:

```python
# top of src/maxheap/__init__.py
import os
try:
    if os.getenv("MAXHEAP_PURE"):
        raise ImportError
    from ._cmaxheap import heapify, heappush, heappop, heappushpop, heapreplace  # type: ignore
    _HAVE_CEXT = True
except Exception:
    from ._core import heapify, heappush, heappop, heappushpop, heapreplace
    _HAVE_CEXT = False
```

Then:

```bash
python -m pip install -e .
python benchmarks/bench_maxheap.py --csv benchmarks/results_cext.csv

MAXHEAP_PURE=1 python benchmarks/bench_maxheap.py --csv benchmarks/results_pure.csv
```

---

## Packaging (optional)

```bash
rm -rf dist
python -m build            # pip install build, if needed
python -m pip install -U twine
twine upload --repository testpypi dist/*
```

Fresh-venv verification:

```bash
python -m venv /tmp/venv && source /tmp/venv/bin/activate
python -m pip install -i https://test.pypi.org/simple/ maxheap
python - <<'PY'
import maxheap
print(maxheap._HAVE_CEXT, maxheap.heapify.__module__)
PY
```

---

## Project layout

```
.
├── benchmarks/
│   └── bench_maxheap.py     # microbenchmarks (CSV capable)
├── src/
│   └── maxheap/
│       ├── _cmaxheap.c      # C accelerator (optional)
│       ├── _core.py         # pure-Python implementation
│       └── __init__.py      # optional import of C ext, fallback to Python
├── tests/
│   ├── test_maxheap.py      # unit tests
│   └── test_properties.py   # property-based tests
├── pyproject.toml
└── README.md
```

---

## Troubleshooting

### “`.venv/bin/python: No such file or directory`” or prompt shows `(.venv)` but it’s broken

You’re in a shell with a **stale** venv path. Fix:

```bash
deactivate 2>/dev/null || true
rm -rf .venv build *.egg-info src/*.egg-info
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -U pip setuptools wheel
python -m pip install -e .
```

Check:

```bash
echo "$VIRTUAL_ENV"           # should point to .../maxheap/library/.venv
which python                  # should be .../maxheap/library/.venv/bin/python
```

### “`ModuleNotFoundError: No module named 'maxheap'`”

* Ensure you ran `python -m pip install -e .` in the **repo root**.
* Ensure tests are run with the **same venv**:

  ```bash
  python -m pytest -q
  ```
* Confirm where `maxheap` is imported from:

  ```bash
  python - <<'PY'
  ```

import maxheap, os
print(os.path.dirname(maxheap.**file**))
PY

````

### Rebuild didn’t pick up code changes

Remove build artifacts and reinstall:

```bash
rm -rf build
python -m pip install -e .
````

---

## API reference (quick)

```python
# functional API
heapify(x: List[T]) -> None
heappush(heap: List[T], item: T) -> None
heappop(heap: List[T]) -> T
heappushpop(heap: List[T], item: T) -> T
heapreplace(heap: List[T], item: T) -> T
peek(heap: List[T]) -> T
is_heap(x: List[T]) -> bool

# OO wrapper
class MaxHeap(Generic[T]):
    def __init__(self, iterable: Optional[Iterable[T]] = None) -> None: ...
    def push(self, item: T) -> None: ...
    def pop(self) -> T: ...
    def peek(self) -> T: ...
    def replace(self, item: T) -> T: ...
    def pushpop(self, item: T) -> T: ...
    def heap(self) -> List[T]: ...
    def __len__(self) -> int: ...
```

---


## Notes on performance

* The accelerator focuses on the hot operations that do comparisons and pointer moves (`heapify`, `heappush`, `heappop`, `heappushpop`, `heapreplace`).
* `peek`, `is_heap`, and the `MaxHeap` wrapper remain in Python—these aren’t hot in typical workloads, and keeping them in Python preserves readability.

### Benchmark highlights

| operation               | median time (s) | speedup vs `heapq`+negation |
| ----------------------- | --------------- | --------------------------- |
| heappush (maxheap)      | 0.00535         | \~19% faster                |
| heapify (maxheap)       | 0.00349         | \~28% faster                |
| heapify+drain (maxheap) | 0.04043         | \~41% faster                |

**Result:** Max-first heap without the negation hack, and *still* beating the pants off `heapq`.

---


## Contributing

* Format/lint: `ruff` (see `pyproject.toml`)
* Types: `mypy` (strict options)
* Tests: `pytest`, property tests via `hypothesis`

PRs and issues welcome!

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "maxheapx",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": "heap, priority queue, max-heap, data structures",
    "author": "Timothy Roch",
    "author_email": null,
    "download_url": null,
    "platform": null,
    "description": "# maxheap\n\nA **max-heap** library with an API that mirrors Python\u2019s `heapq`\u2014but **max-first**.\nIt ships with a fast **C accelerator** (`maxheap._cmaxheap`) and a **pure-Python fallback**.\n\n* Python: 3.9\u20133.13\n* License: MIT\n* Package name: `maxheap`\n\n---\n\n## Features\n\n* Functional API: `heapify`, `heappush`, `heappop`, `heappushpop`, `heapreplace`, `peek`, `is_heap`\n* OO wrapper: `MaxHeap` with `push/pop/peek/replace/pushpop`\n* Optional C extension for speed; pure-Python fallback if unavailable\n* Reproducible **microbenchmarks** with CSV output\n* Test suite (`pytest`) including property tests\n\n---\n\n## Quickstart (from a fresh clone)\n\n> **Run all commands from the project root** (the folder that contains `pyproject.toml`).\n\n### macOS/Linux (bash/zsh)\n\n```bash\n# 0) Verify you're in the repo root\npwd\nls pyproject.toml\n\n# 1) Create a clean virtualenv\npython3 -m venv .venv\n\n# 2) Activate it\nsource .venv/bin/activate\n\n# 3) Confirm it's active & valid\necho \"VIRTUAL_ENV=$VIRTUAL_ENV\"\ntest -x .venv/bin/python && echo \"venv OK\" || echo \"venv MISSING\"\npython -V\n\n# 4) Install in editable mode (builds the C extension)\npython -m pip install -U pip setuptools wheel\npython -m pip install -e .\n\n# 5) Sanity check the extension is loaded\npython - <<'PY'\nimport maxheap, sys\nprint(\"HAVE_CEXT:\", getattr(maxheap, \"_HAVE_CEXT\", None))\nprint(\"heapify impl:\", maxheap.heapify.__module__)\nprint(\"python:\", sys.version)\nPY\n```\n\nExpected:\n\n```\nHAVE_CEXT: True\nheapify impl: maxheap._cmaxheap\npython: 3.13.x (...)\n```\n\nIf `HAVE_CEXT` is `False`, you\u2019re using the pure-Python fallback.\n\n### Windows (PowerShell)\n\n```powershell\n# 0) Verify you're in the repo root\nGet-ChildItem pyproject.toml\n\n# 1) Create a venv\npy -m venv .venv\n\n# 2) Activate\n. .\\.venv\\Scripts\\Activate.ps1\n\n# 3) Install (use -m to ensure the venv's Python)\npython -m pip install -U pip setuptools wheel\npython -m pip install -e .\n\n# 4) Sanity\npython - <<'PY'\nimport maxheap, sys\nprint(\"HAVE_CEXT:\", getattr(maxheap, \"_HAVE_CEXT\", None))\nprint(\"heapify impl:\", maxheap.heapify.__module__)\nprint(\"python:\", sys.version)\nPY\n```\n\n---\n\n## Rebuilding after C changes\n\nAny time you modify `src/maxheap/_cmaxheap.c`, rebuild:\n\n```bash\n# inside the activated venv\nrm -rf build\npython -m pip install -e .\n```\n\n---\n\n\n## Usage\n\nThe API mirrors Python\u2019s built-in [`heapq`](https://docs.python.org/3/library/heapq.html) \u2014 but instead of a min-heap that requires negating keys for max-first behavior, **`maxheap` stores the largest element at index `0`** and operates directly without the negation overhead.\n\nYou can choose between a **functional API** (works on plain lists) and an **OO wrapper** (`MaxHeap` class).\n\n---\n\n### Functional API\n\n```python\nimport maxheap as heapq  # same API names as heapq\n\n# Start with an empty list\nh = []\n\n# Push elements\nheapq.heappush(h, 3)\nheapq.heappush(h, 10)\nheapq.heappush(h, 5)\n\n# Peek at the largest without removing it\nheapq.peek(h)             # -> 10\n\n# Pop the largest\nheapq.heappop(h)          # -> 10\nheapq.peek(h)             # -> 5\n\n# Replace the largest atomically\nheapq.heapreplace(h, 4)   # pops max (5), pushes 4 -> returns 5\n\n# Push an element and pop the largest in a single step\nheapq.heappushpop(h, 7)   # pushes 7, pops max -> returns 7\n\n# Turn any list into a valid max-heap in place\ndata = [1, 8, 3, 2]\nheapq.heapify(data)       # data is now a valid max-heap\n```\n\n**When to use:**\n\n* You want to use the `heapq`-style API but without the min-heap + negation hack.\n* You don\u2019t need to subclass or wrap the heap in your own object.\n\n---\n\n### OO wrapper\n\n```python\nfrom maxheap import MaxHeap\n\n# Initialize from iterable\nh = MaxHeap([3, 1, 6, 5, 2, 4])\n\n# Push and pop\nh.push(10)\nh.peek()   # -> 10\nh.pop()    # -> 10\n\n# Length and iteration\nlen(h)     # -> 6\nlist(h)    # Pops all items in descending order\n\n# Check if a list is a valid max-heap\nMaxHeap.is_heap([10, 5, 6, 2])   # True\n```\n\n**When to use:**\n\n* You want an object that *owns* its heap data.\n* You want utility methods (`peek`, `is_heap`, iteration) with clean semantics.\n\n---\n\n**Tip:** All hot-path operations (`heapify`, `heappush`, `heappop`, `heappushpop`, `heapreplace`) are C-accelerated \u2014 so you get **max-heap behavior faster than `heapq` with negation**.\n\n---\n\n## Running the tests\n\n```bash\n# ensure venv is active and package is installed\nsource .venv/bin/activate  # Windows: .venv\\Scripts\\activate\npython -m pip install -e .\npython -m pip install -q pytest hypothesis\npython -m pytest -q\n```\n\nYou should see all tests green (`tests/test_maxheap.py`, `tests/test_properties.py`).\n\n---\n\n## Benchmarks\n\nThe benchmark compares `maxheap` with a **baseline** using stdlib `heapq` as a max-heap via negation (`-x`).\n\n### Quick run\n\n```bash\npython benchmarks/bench_maxheap.py\n```\n\n### Larger run + CSV output\n\n```bash\nmkdir -p benchmarks\npython benchmarks/bench_maxheap.py --n 100000 --repeat 10 --warmup 3 --seed 1 \\\n  --csv benchmarks/results.csv\nhead benchmarks/results.csv\n```\n\n**CLI flags**\n\n* `--n` (default `10000`) \u2014 number of items\n* `--repeat` (default `5`) \u2014 measured iterations per case\n* `--warmup` (default `1`) \u2014 warmup runs\n* `--seed` (default `1337`) \u2014 RNG seed\n* `--csv` \u2014 write a results CSV\n\n**Benchmarks covered**\n\n* `heappush`\n* `heapify`\n* `heapify+drain` (heapify then pop all)\n* `heappushpop`\n* `heapreplace`\n\n**Interpreting output**\n\nEach line prints `min / median / mean`. When a baseline exists (the negation variant), a `%` indicates **median** speedup (positive = faster than baseline).\n\n---\n\n## A/B: Force the pure-Python fallback (optional)\n\nIf you want to compare C vs Python on your machine, temporarily let the package respect an env var:\n\n```python\n# top of src/maxheap/__init__.py\nimport os\ntry:\n    if os.getenv(\"MAXHEAP_PURE\"):\n        raise ImportError\n    from ._cmaxheap import heapify, heappush, heappop, heappushpop, heapreplace  # type: ignore\n    _HAVE_CEXT = True\nexcept Exception:\n    from ._core import heapify, heappush, heappop, heappushpop, heapreplace\n    _HAVE_CEXT = False\n```\n\nThen:\n\n```bash\npython -m pip install -e .\npython benchmarks/bench_maxheap.py --csv benchmarks/results_cext.csv\n\nMAXHEAP_PURE=1 python benchmarks/bench_maxheap.py --csv benchmarks/results_pure.csv\n```\n\n---\n\n## Packaging (optional)\n\n```bash\nrm -rf dist\npython -m build            # pip install build, if needed\npython -m pip install -U twine\ntwine upload --repository testpypi dist/*\n```\n\nFresh-venv verification:\n\n```bash\npython -m venv /tmp/venv && source /tmp/venv/bin/activate\npython -m pip install -i https://test.pypi.org/simple/ maxheap\npython - <<'PY'\nimport maxheap\nprint(maxheap._HAVE_CEXT, maxheap.heapify.__module__)\nPY\n```\n\n---\n\n## Project layout\n\n```\n.\n\u251c\u2500\u2500 benchmarks/\n\u2502   \u2514\u2500\u2500 bench_maxheap.py     # microbenchmarks (CSV capable)\n\u251c\u2500\u2500 src/\n\u2502   \u2514\u2500\u2500 maxheap/\n\u2502       \u251c\u2500\u2500 _cmaxheap.c      # C accelerator (optional)\n\u2502       \u251c\u2500\u2500 _core.py         # pure-Python implementation\n\u2502       \u2514\u2500\u2500 __init__.py      # optional import of C ext, fallback to Python\n\u251c\u2500\u2500 tests/\n\u2502   \u251c\u2500\u2500 test_maxheap.py      # unit tests\n\u2502   \u2514\u2500\u2500 test_properties.py   # property-based tests\n\u251c\u2500\u2500 pyproject.toml\n\u2514\u2500\u2500 README.md\n```\n\n---\n\n## Troubleshooting\n\n### \u201c`.venv/bin/python: No such file or directory`\u201d or prompt shows `(.venv)` but it\u2019s broken\n\nYou\u2019re in a shell with a **stale** venv path. Fix:\n\n```bash\ndeactivate 2>/dev/null || true\nrm -rf .venv build *.egg-info src/*.egg-info\npython3 -m venv .venv\nsource .venv/bin/activate\npython -m pip install -U pip setuptools wheel\npython -m pip install -e .\n```\n\nCheck:\n\n```bash\necho \"$VIRTUAL_ENV\"           # should point to .../maxheap/library/.venv\nwhich python                  # should be .../maxheap/library/.venv/bin/python\n```\n\n### \u201c`ModuleNotFoundError: No module named 'maxheap'`\u201d\n\n* Ensure you ran `python -m pip install -e .` in the **repo root**.\n* Ensure tests are run with the **same venv**:\n\n  ```bash\n  python -m pytest -q\n  ```\n* Confirm where `maxheap` is imported from:\n\n  ```bash\n  python - <<'PY'\n  ```\n\nimport maxheap, os\nprint(os.path.dirname(maxheap.**file**))\nPY\n\n````\n\n### Rebuild didn\u2019t pick up code changes\n\nRemove build artifacts and reinstall:\n\n```bash\nrm -rf build\npython -m pip install -e .\n````\n\n---\n\n## API reference (quick)\n\n```python\n# functional API\nheapify(x: List[T]) -> None\nheappush(heap: List[T], item: T) -> None\nheappop(heap: List[T]) -> T\nheappushpop(heap: List[T], item: T) -> T\nheapreplace(heap: List[T], item: T) -> T\npeek(heap: List[T]) -> T\nis_heap(x: List[T]) -> bool\n\n# OO wrapper\nclass MaxHeap(Generic[T]):\n    def __init__(self, iterable: Optional[Iterable[T]] = None) -> None: ...\n    def push(self, item: T) -> None: ...\n    def pop(self) -> T: ...\n    def peek(self) -> T: ...\n    def replace(self, item: T) -> T: ...\n    def pushpop(self, item: T) -> T: ...\n    def heap(self) -> List[T]: ...\n    def __len__(self) -> int: ...\n```\n\n---\n\n\n## Notes on performance\n\n* The accelerator focuses on the hot operations that do comparisons and pointer moves (`heapify`, `heappush`, `heappop`, `heappushpop`, `heapreplace`).\n* `peek`, `is_heap`, and the `MaxHeap` wrapper remain in Python\u2014these aren\u2019t hot in typical workloads, and keeping them in Python preserves readability.\n\n### Benchmark highlights\n\n| operation               | median time (s) | speedup vs `heapq`+negation |\n| ----------------------- | --------------- | --------------------------- |\n| heappush (maxheap)      | 0.00535         | \\~19% faster                |\n| heapify (maxheap)       | 0.00349         | \\~28% faster                |\n| heapify+drain (maxheap) | 0.04043         | \\~41% faster                |\n\n**Result:** Max-first heap without the negation hack, and *still* beating the pants off `heapq`.\n\n---\n\n\n## Contributing\n\n* Format/lint: `ruff` (see `pyproject.toml`)\n* Types: `mypy` (strict options)\n* Tests: `pytest`, property tests via `hypothesis`\n\nPRs and issues welcome!\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "A max-heap library with an API that mirrors Python's heapq (but max-first).",
    "version": "0.1.1",
    "project_urls": {
        "Documentation": "https://maxheap.vercel.app/docs",
        "Homepage": "https://maxheap.vercel.app",
        "Issues": "https://github.com/timothyroch/maxheap/issues",
        "Source": "https://github.com/timothyroch/maxheap"
    },
    "split_keywords": [
        "heap",
        " priority queue",
        " max-heap",
        " data structures"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "9b14bd8319b78da282e65bc401996465d69cc9f2d58821fa7627f5f08e921d90",
                "md5": "623e580128a4545babfb97e51080d27f",
                "sha256": "353c19a43c4ba07b9ca88a66d3f792fac82ab91423a1c840e3e53dbf12a00b6b"
            },
            "downloads": -1,
            "filename": "maxheapx-0.1.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",
            "has_sig": false,
            "md5_digest": "623e580128a4545babfb97e51080d27f",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 23422,
            "upload_time": "2025-08-14T02:02:56",
            "upload_time_iso_8601": "2025-08-14T02:02:56.591880Z",
            "url": "https://files.pythonhosted.org/packages/9b/14/bd8319b78da282e65bc401996465d69cc9f2d58821fa7627f5f08e921d90/maxheapx-0.1.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "324bec30a01bc100e119fac77649ec34927a7966891e8fecd68ff75afc6969be",
                "md5": "9711fffc4c9c3c46c10a2e20a643989a",
                "sha256": "476f66e0432e6fb45661a57b22652188c3682506628e79e5227cbd17f98cc6f5"
            },
            "downloads": -1,
            "filename": "maxheapx-0.1.1-cp310-cp310-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "9711fffc4c9c3c46c10a2e20a643989a",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 23408,
            "upload_time": "2025-08-14T02:02:58",
            "upload_time_iso_8601": "2025-08-14T02:02:58.253086Z",
            "url": "https://files.pythonhosted.org/packages/32/4b/ec30a01bc100e119fac77649ec34927a7966891e8fecd68ff75afc6969be/maxheapx-0.1.1-cp310-cp310-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "4c93355b59881e6307e214cbeccf73531ebb0c0b8fe593f614ad1bb92d8c71dc",
                "md5": "a8a651f3d6969d1762c12cb5c5313c39",
                "sha256": "574863a484f24d78f7b543de8f50978d99a6f92788261aac9c3a36d2a56c4906"
            },
            "downloads": -1,
            "filename": "maxheapx-0.1.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",
            "has_sig": false,
            "md5_digest": "a8a651f3d6969d1762c12cb5c5313c39",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 24797,
            "upload_time": "2025-08-14T02:02:59",
            "upload_time_iso_8601": "2025-08-14T02:02:59.698045Z",
            "url": "https://files.pythonhosted.org/packages/4c/93/355b59881e6307e214cbeccf73531ebb0c0b8fe593f614ad1bb92d8c71dc/maxheapx-0.1.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a092f6dd0eb50f49e0a73cad8756b15aabbc9161b328856d4a31dcac47f7ee91",
                "md5": "9214bb3d824ce03765a706fc12d7746d",
                "sha256": "5c2ab61f5749e96a6566fd644aebd0308faef440948efb7b9af3c605dd58788b"
            },
            "downloads": -1,
            "filename": "maxheapx-0.1.1-cp311-cp311-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "9214bb3d824ce03765a706fc12d7746d",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 24808,
            "upload_time": "2025-08-14T02:03:01",
            "upload_time_iso_8601": "2025-08-14T02:03:01.031386Z",
            "url": "https://files.pythonhosted.org/packages/a0/92/f6dd0eb50f49e0a73cad8756b15aabbc9161b328856d4a31dcac47f7ee91/maxheapx-0.1.1-cp311-cp311-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "9c840828b5109013d052e3b716b00392f01b8c8cc4647f5d5f4d1ad4dfaa59f8",
                "md5": "11a286916e445e7b8153c1d1790c288f",
                "sha256": "80df0a07193729b9134c04bac958ce7d96a857422ff38821a5a154a1bf9c5ee2"
            },
            "downloads": -1,
            "filename": "maxheapx-0.1.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",
            "has_sig": false,
            "md5_digest": "11a286916e445e7b8153c1d1790c288f",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 25881,
            "upload_time": "2025-08-14T02:03:02",
            "upload_time_iso_8601": "2025-08-14T02:03:02.249054Z",
            "url": "https://files.pythonhosted.org/packages/9c/84/0828b5109013d052e3b716b00392f01b8c8cc4647f5d5f4d1ad4dfaa59f8/maxheapx-0.1.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "c712a0d96d3290529c49b77d093d35e305ecf94c4b8d1e397798f950957ecbf5",
                "md5": "81eecfa00079af69e879c9db1b81a798",
                "sha256": "742c4acfb592f9164ca7f4cc780fbe67ed1ca704ee81ca94172de06eb4a73326"
            },
            "downloads": -1,
            "filename": "maxheapx-0.1.1-cp312-cp312-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "81eecfa00079af69e879c9db1b81a798",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 25793,
            "upload_time": "2025-08-14T02:03:03",
            "upload_time_iso_8601": "2025-08-14T02:03:03.495470Z",
            "url": "https://files.pythonhosted.org/packages/c7/12/a0d96d3290529c49b77d093d35e305ecf94c4b8d1e397798f950957ecbf5/maxheapx-0.1.1-cp312-cp312-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "6b6028d187c6e7cdfbc747a62e857f31cab6681ce0194a906f784fa5b1f9dc9d",
                "md5": "c5e50cc6148ee1d73d1dd23c4d1d3766",
                "sha256": "c909e1492f0f8616d0c753ce519542c43ef46e2204bd95f14c650fabc4838439"
            },
            "downloads": -1,
            "filename": "maxheapx-0.1.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",
            "has_sig": false,
            "md5_digest": "c5e50cc6148ee1d73d1dd23c4d1d3766",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.9",
            "size": 25958,
            "upload_time": "2025-08-14T02:03:05",
            "upload_time_iso_8601": "2025-08-14T02:03:05.011751Z",
            "url": "https://files.pythonhosted.org/packages/6b/60/28d187c6e7cdfbc747a62e857f31cab6681ce0194a906f784fa5b1f9dc9d/maxheapx-0.1.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "53f32a610a5b504b1c8c6b8ea5fa85319063cb659a7d34286cab331474b9084d",
                "md5": "adfdc0da2b75d4f1b040547f1a0bb28e",
                "sha256": "5fa895db83d63bdd56aae86130254f47a83ac235837474082f819b036ee23efe"
            },
            "downloads": -1,
            "filename": "maxheapx-0.1.1-cp313-cp313-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "adfdc0da2b75d4f1b040547f1a0bb28e",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.9",
            "size": 25832,
            "upload_time": "2025-08-14T02:03:06",
            "upload_time_iso_8601": "2025-08-14T02:03:06.343053Z",
            "url": "https://files.pythonhosted.org/packages/53/f3/2a610a5b504b1c8c6b8ea5fa85319063cb659a7d34286cab331474b9084d/maxheapx-0.1.1-cp313-cp313-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "7ea02b5c4e15e164e6c496561aaa0663854e5174f67af9cee7ea3730f31165fe",
                "md5": "c4e7e9b2d8ad926ae612b39e141c9824",
                "sha256": "abd549dd40421a037bc89c784e6402517c4010f89018252b0dc50522fb8cfe36"
            },
            "downloads": -1,
            "filename": "maxheapx-0.1.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",
            "has_sig": false,
            "md5_digest": "c4e7e9b2d8ad926ae612b39e141c9824",
            "packagetype": "bdist_wheel",
            "python_version": "cp314",
            "requires_python": ">=3.9",
            "size": 26064,
            "upload_time": "2025-08-14T02:03:07",
            "upload_time_iso_8601": "2025-08-14T02:03:07.274226Z",
            "url": "https://files.pythonhosted.org/packages/7e/a0/2b5c4e15e164e6c496561aaa0663854e5174f67af9cee7ea3730f31165fe/maxheapx-0.1.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f26bc1135414b06712f35844c23daab161b6fc89ad3b8df41f4396b4ba2bc22b",
                "md5": "144b8586d9108870ddf094f286d74ee8",
                "sha256": "be3f89d05944cece18175c9db639ee519fc1e8c252561e3c92c0835c81ac2e56"
            },
            "downloads": -1,
            "filename": "maxheapx-0.1.1-cp314-cp314-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "144b8586d9108870ddf094f286d74ee8",
            "packagetype": "bdist_wheel",
            "python_version": "cp314",
            "requires_python": ">=3.9",
            "size": 25944,
            "upload_time": "2025-08-14T02:03:08",
            "upload_time_iso_8601": "2025-08-14T02:03:08.493533Z",
            "url": "https://files.pythonhosted.org/packages/f2/6b/c1135414b06712f35844c23daab161b6fc89ad3b8df41f4396b4ba2bc22b/maxheapx-0.1.1-cp314-cp314-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "2bb975449ede9353cf5bdde5655a82203eece4d5cbd7c48355df8a11a35d2b3c",
                "md5": "39f1d43cc7c35f246f56e8ec9fc72773",
                "sha256": "ff9ea72f8af2a17319892c9c81e560339e4a6bb1b4dc14ea021e657074b508ce"
            },
            "downloads": -1,
            "filename": "maxheapx-0.1.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",
            "has_sig": false,
            "md5_digest": "39f1d43cc7c35f246f56e8ec9fc72773",
            "packagetype": "bdist_wheel",
            "python_version": "cp314",
            "requires_python": ">=3.9",
            "size": 30876,
            "upload_time": "2025-08-14T02:03:09",
            "upload_time_iso_8601": "2025-08-14T02:03:09.381782Z",
            "url": "https://files.pythonhosted.org/packages/2b/b9/75449ede9353cf5bdde5655a82203eece4d5cbd7c48355df8a11a35d2b3c/maxheapx-0.1.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "8c0e0f719fb5bf642400f7dbdf26753de94ca5c3d46ad039b163346fb9237e75",
                "md5": "2f05d2800a6ea4678df7625e3e534e0e",
                "sha256": "de606dcdadb9898659b136e9d48f3b272b7a357ddc504486e6c5b77845f97548"
            },
            "downloads": -1,
            "filename": "maxheapx-0.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "2f05d2800a6ea4678df7625e3e534e0e",
            "packagetype": "bdist_wheel",
            "python_version": "cp314",
            "requires_python": ">=3.9",
            "size": 30380,
            "upload_time": "2025-08-14T02:03:10",
            "upload_time_iso_8601": "2025-08-14T02:03:10.846832Z",
            "url": "https://files.pythonhosted.org/packages/8c/0e/0f719fb5bf642400f7dbdf26753de94ca5c3d46ad039b163346fb9237e75/maxheapx-0.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "c3b12a7f8496a80578b9c6df20127eaa169552310b14bc6b3379fa2ceb6af3c3",
                "md5": "b62f36579b3e350bf58b1092854936bb",
                "sha256": "bab208c6a6cb26c61220afc6ee013391d325a362d307218f7ab9f18d285bc69a"
            },
            "downloads": -1,
            "filename": "maxheapx-0.1.1-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",
            "has_sig": false,
            "md5_digest": "b62f36579b3e350bf58b1092854936bb",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 23175,
            "upload_time": "2025-08-14T02:03:11",
            "upload_time_iso_8601": "2025-08-14T02:03:11.873528Z",
            "url": "https://files.pythonhosted.org/packages/c3/b1/2a7f8496a80578b9c6df20127eaa169552310b14bc6b3379fa2ceb6af3c3/maxheapx-0.1.1-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "785b72094cc5a5aba564c508da1904be28de124c70e634928cf1bcf6f73d0709",
                "md5": "90636afb5391be5698b87e8ca0453895",
                "sha256": "70d3d323edbd8765e50642f035ca5670a16e899c105a77f402ff2e6435c484d0"
            },
            "downloads": -1,
            "filename": "maxheapx-0.1.1-cp39-cp39-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "90636afb5391be5698b87e8ca0453895",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 23157,
            "upload_time": "2025-08-14T02:03:13",
            "upload_time_iso_8601": "2025-08-14T02:03:13.509948Z",
            "url": "https://files.pythonhosted.org/packages/78/5b/72094cc5a5aba564c508da1904be28de124c70e634928cf1bcf6f73d0709/maxheapx-0.1.1-cp39-cp39-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-14 02:02:56",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "timothyroch",
    "github_project": "maxheap",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "maxheapx"
}
        
Elapsed time: 0.89916s