Skip to main content

C++ accelerated data preparation for pandas and the Python data stack

Project description


Arnio



Fast data preparation for the Python data stack.


Arnio is a compiled C++ data preparation engine for messy CSV and pandas workflows.
It parses, infers types, strips whitespace, deduplicates, validates, and profiles data —
then hands clean results back to the tools you already use.
Use Arnio before and alongside pandas, NumPy, scikit-learn, DuckDB, and Arrow.


PyPI  Python  CI  Coverage  MIT  GSSoC 2026  Join Discord PyPI Downloads



pip install arnio

Colab install smoke test: COLAB_SMOKE_TEST.md


Quickstart · Integrations · Why Arnio · Architecture · Benchmarks · Community · Contribute




⚡ Quickstart

Three lines. That's the entire workflow.

import arnio as ar

# Load CSV directly through C++ — no Python parsing overhead
frame = ar.read_csv("messy_sales_data.csv")

# Declare what clean data looks like — arnio handles the rest
clean = ar.pipeline(frame, [
    ("strip_whitespace",),
    ("normalize_case", {"case_type": "lower"}),
    ("fill_nulls", {"value": 0.0, "subset": ["revenue"]}),
    ("drop_nulls",),
    ("drop_duplicates",),
])

# Out comes a standard pandas DataFrame — use it like you always have
df = ar.to_pandas(clean)

Already have a pandas DataFrame? Use Arnio in-place in your existing pandas workflow:

import pandas as pd
import arnio as ar

df = pd.read_csv("messy_sales_data.csv")

clean_df = df.arnio.clean([
    ("strip_whitespace",),
    ("normalize_case", {"case_type": "lower"}),
    ("drop_duplicates",),
])

report = clean_df.arnio.profile()

Select specific columns

Use select_columns() to create a new ArFrame with only the required columns before converting to pandas.

selected = frame.select_columns(["name", "revenue"])

print(selected.columns)
# ['name', 'revenue']

Every step above executes in C++. Your Python code is a configuration — not the execution engine.


📸 Peek at a 100 GB file without loading it

scan_csv reads only the header + a sample to infer the schema. Zero data loaded.

schema = ar.scan_csv("100GB_file.csv")
# {'id': 'int64', 'name': 'string', 'is_active': 'bool', 'revenue': 'float64'}

Useful for exploring datasets before committing memory.

👀 Preview rows without pandas conversion or full-column Python list materialization

preview() reads only the first n rows directly from the C++ frame — no pandas conversion triggered.

frame = ar.read_csv("huge_file.csv")

print(frame.preview())      # first 5 rows (default)
print(frame.preview(n=10))  # first 10 rows

Raises ValueError for invalid n (zero, negative, or non-integer).

🧩 Add custom steps without touching C++

Register any Python function as a pipeline step. It receives a DataFrame, returns a DataFrame.

def remove_outliers(df, column="revenue", threshold=100_000):
    return df[df[column] <= threshold]

ar.register_step("remove_outliers", remove_outliers)

# Now use it in any pipeline alongside native C++ steps
clean = ar.pipeline(frame, [
    ("strip_whitespace",),
    ("remove_outliers", {"column": "revenue", "threshold": 50000}),
    ("drop_duplicates",),
])

Custom steps run through a pandas↔ArFrame conversion bridge. Prototype in Python, then optionally migrate hot paths to C++ for full speed.




🔗 Integrations

Arnio is designed to make the rest of the Python data stack more productive, not to replace it.

Workflow How Arnio helps
pandas Clean, validate, and profile messy DataFrames through df.arnio.
NumPy Prepare typed numeric data before array/modeling workflows.
scikit-learn Use Arnio cleaning as a preprocessing layer before model training.
DuckDB / Arrow Validate and prepare data before analytics and columnar exchange.
notebooks Inspect quality issues and cleaning suggestions before analysis.

Pandas accessor

df = pd.read_csv("raw_customers.csv")

clean_df = df.arnio.clean(drop_duplicates=True)
quality = clean_df.arnio.profile()
validation = clean_df.arnio.validate({
    "email": ar.Email(nullable=False),
    "age": ar.Int64(nullable=True, min=0),
})

This keeps pandas as the analysis tool while Arnio handles the preparation, quality, and validation layer.

Product direction: PROJECT_DIRECTION.md




🔍 Why Arnio exists

Every data project starts the same way:

df = pd.read_csv("data.csv")              # 💥 RAM spike — entire file as raw strings
df.columns = df.columns.str.strip()        # Why is this not automatic?
df["name"] = df["name"].str.strip()        # Python loop over every cell
df["name"] = df["name"].str.lower()        # Another Python loop
df = df.dropna()                           # Another pass
df = df.drop_duplicates()                  # Another pass

Six lines. Four full-data passes. All in interpreted Python. This is fine for a Jupyter demo — but it doesn't scale, it doesn't compose, and it definitely doesn't belong in production.

Arnio intercepts this entire pattern. It moves the preparation layer into a predictable pipeline, accelerates supported operations in C++, and gives you clean data for pandas, NumPy, scikit-learn, DuckDB, or notebooks.

Without Arnio

df = pd.read_csv(path)
df.columns = df.columns.str.strip()
for col in str_cols:
    df[col] = df[col].str.strip()
    df[col] = df[col].str.lower()
df = df.dropna(subset=["revenue"])
df = df.drop_duplicates()
# 6+ lines, multiple passes, pure Python

With Arnio

frame = ar.read_csv(path)
df = ar.to_pandas(ar.pipeline(frame, [
    ("strip_whitespace",),
    ("normalize_case", {"case_type": "lower"}),
    ("drop_nulls", {"subset": ["revenue"]}),
    ("drop_duplicates",),
]))
# Declarative. Single pipeline. C++ execution.



🏗️ Architecture

Arnio is not a pandas wrapper. It's a separate runtime with its own data model.

┌──────────────────────────────────────────────────────────────┐
│  Your Python Code                                            │
│  frame = ar.read_csv("data.csv")                             │
│  clean = ar.pipeline(frame, [...])                           │
│  df = ar.to_pandas(clean)                                    │
└────────────────────────┬─────────────────────────────────────┘
                         │  pybind11 boundary
┌────────────────────────▼─────────────────────────────────────┐
│  C++ Runtime  (_arnio_cpp)                                   │
│                                                              │
│  ┌─────────────┐  ┌─────────────────┐  ┌──────────────────┐ │
│  │  CsvReader   │  │  Frame/Column   │  │  Cleaning Engine │ │
│  │  • RFC 4180  │  │  • Columnar     │  │  • drop_nulls    │ │
│  │  • BOM strip │  │  • std::variant │  │  • fill_nulls    │ │
│  │  • Type      │  │  • Bool null    │  │  • drop_dupes    │ │
│  │    inference │  │    masks        │  │  • strip_ws      │ │
│  │  • Quoted    │  │  • O(1) column  │  │  • normalize     │ │
│  │    fields    │  │    lookup       │  │  • rename/cast   │ │
│  └─────────────┘  └─────────────────┘  └──────────────────┘ │
│                                                              │
│  to_pandas() ──→ zero-copy NumPy buffer (numerics/bools)     │
└──────────────────────────────────────────────────────────────┘

Design decisions that matter

Decision What it means
Columnar storage Data lives in typed std::vectors — vector<int64_t>, vector<double>, vector<string> — not rows of variants. Cache-friendly and SIMD-ready.
Boolean null masks Nulls are tracked in a separate vector<bool>, keeping data vectors dense. No sentinel values, no NaN tricks.
Two-pass CSV read Pass 1 infers types across all rows. Pass 2 parses values directly into the correct typed column. No string→object→cast overhead.
Zero-copy bridge to_pandas() exposes C++ memory directly via NumPy's buffer protocol. Numeric and boolean columns cross the boundary without copying.
Step registry Pipeline steps map to C++ function pointers. Adding a new cleaning primitive is a single function + one registry entry.

Full architecture documentation: ARCHITECTURE.md




🏎️ Benchmarks

Reference environment: Ubuntu, Python 3.12, synthetic messy CSV inputs.
Reproduce: make benchmark — generates deterministic tall and wide datasets and runs both engines.

To reproduce the published numbers from a fresh checkout:

python -m venv .venv
source .venv/bin/activate
python -m pip install -U pip
python -m pip install -e .
python benchmarks/generate_data.py
python benchmarks/benchmark_vs_pandas.py

benchmarks/generate_data.py uses deterministic NumPy seeds, so every run creates the same benchmarks/benchmark_1m.csv tall input and benchmarks/benchmark_wide.csv wide input. The benchmark then executes three pandas runs and three arnio runs for each case, printing average wall-clock time from time.perf_counter() and peak Python allocation from tracemalloc. For cleaner comparisons, close other memory-heavy processes and run the script from the repository root after installing the same Python, pandas, NumPy, compiler, and arnio commit you want to compare.

Expected output format:

Tall CSV (1,000,000 rows x 12 columns)
Metric                     pandas        arnio
────────────────────────────────────────────
Exec Time (avg)       4.73s         5.75s
Peak RAM               211MB         212MB
Speed: 0.8x | RAM: -1% reduction

Wide CSV (5,000 rows x 256 columns)
Metric                     pandas        arnio
────────────────────────────────────────────
Exec Time (avg)       ...s          ...s
Peak RAM              ...MB         ...MB
Speed: ...x | RAM: ...% reduction

Small differences are expected across CPUs, operating systems, compilers, Python builds, and pandas/NumPy versions. If you share benchmark results in an issue or PR, include your OS, Python version, CPU model, pandas/NumPy versions, arnio commit, and the full command output so maintainers can compare like for like.

Arnio is near memory parity in the reference benchmark while replacing ad-hoc Python string loops with a compiled, declarative pipeline. Validate memory and speed on your own workload. The execution time gap is a known, active optimization target — the current drop_duplicates and strip_whitespace implementations use unoptimized row-key serialization.

What's already won 🎯 What's being optimized
  • Native C++ parsing eliminates Python memory spikes
  • Columnar storage matches pandas' internal efficiency
  • Declarative API eliminates .apply() spaghetti
  • Zero-copy bridge for numeric conversions
  • drop_duplicates — replace string serialization with hash-based comparisons
  • strip_whitespace — in-place mutation instead of copy-on-write
  • Parallel column processing via std::thread
  • Help close the gap →



🧰 Cleaning primitives

Most operations below run natively in C++. The current filter_rows step uses the Python pipeline backend and may be optimized in C++ later.

Primitive What it does Example
drop_nulls Remove rows with null/empty values ar.drop_nulls(frame, subset=["age"])
validate_columns_exist Fail early when required columns are missing ar.validate_columns_exist(frame, ["age"])
filter_rows Filter rows using comparison operators ar.filter_rows(frame, column="age", op=">", value=18)
fill_nulls Replace nulls with a scalar ar.fill_nulls(frame, 0, subset=["revenue"])
drop_duplicates Deduplicate rows (first/last/none) ar.drop_duplicates(frame, keep="first")
drop_constant_columns Remove columns with only one unique value ar.drop_constant_columns(frame)
clip_numeric Clip numeric values to lower and/or upper bounds ar.clip_numeric(frame, lower=0, upper=100)
strip_whitespace Trim leading/trailing spaces from strings ar.strip_whitespace(frame)
normalize_case Force lower/upper/title case ar.normalize_case(frame, case_type="title")
rename_columns Rename columns via mapping ar.rename_columns(frame, {"old": "new"})
cast_types Cast column types ar.cast_types(frame, {"age": "int64"})
round_numeric_columns Round numeric columns (non-numeric columns in subset ignored safely) ar.round_numeric_columns(frame, decimals=2)
clean Convenience shorthand ar.clean(frame, drop_nulls=True)
safe_divide_columns Divide one column by another, handling zero/null denominators ar.safe_divide_columns(frame, numerator="revenue", denominator="cost", output_column="ratio")

Or compose them all into a pipeline:

clean = ar.pipeline(frame, [
    ("validate_columns_exist", {"columns": ["name", "city", "revenue"]}),
    ("strip_whitespace",),
    ("normalize_case", {"case_type": "lower"}),
    ("fill_nulls", {"value": "unknown", "subset": ["city"]}),
    ("drop_duplicates", {"keep": "first"}),
])

🔎 Filter rows inside pipelines

Use filter_rows to keep only rows matching a condition.

clean = ar.pipeline(frame, [
    ("filter_rows", {
        "column": "revenue",
        "op": ">=",
        "value": 1000
    }),
])

Supported operators:

  • >
  • <
  • >=
  • <=
  • ==
  • !=

Works with:

  • integers
  • floats
  • strings
  • booleans

### 🔢 Safe column division

Divide one column by another while handling division by zero and null denominators explicitly:

result = ar.safe_divide_columns(
    frame,
    numerator="revenue",
    denominator="cost",
    output_column="ratio",
    fill_value=0.0,  # used when denominator is zero or null
)

When the denominator is zero or null, the result is replaced with fill_value (default 0.0) instead of raising an error or producing NaN/Inf.



📊 Pandas Dtype Support Matrix

This table helps users understand which pandas dtypes and workflows are fully supported, partially supported, unsupported, or planned.

If a dtype is partially supported, users may need conversion before processing. Unsupported dtypes should raise clear errors where applicable.

Pandas Dtype Support Status Notes
int64 ✅ Supported Fully supported with native C++ columnar storage
float64 ✅ Supported Fully supported with zero-copy conversion where possible
bool ✅ Supported Native supported boolean type
string ✅ Supported Recommended over object dtype for text workflows
datetime64[ns] ❌ Unsupported No native datetime parsing or conversion support yet
category ⚠️ Limited Converted to string/object during processing
object (mixed columns) ⚠️ Limited Mixed object columns may coerce to string and reduce type inference reliability
nullable pandas dtypes (Int64, boolean) ⚠️ Limited Supported through pandas extension dtypes with null-mask handling
timedelta64[ns] ❌ Unsupported Not currently supported

Notes

  • Numeric and boolean columns are optimized for zero-copy conversion between C++ and pandas.
  • String columns require Python string object creation during to_pandas() conversion.
  • Mixed object columns may reduce type inference accuracy and may require preprocessing.
  • Unsupported dtypes should raise clear user-facing errors instead of silent failures.



🧠 Data quality engine

Arnio now includes built-in dataset understanding before you analyze in pandas.

report = ar.profile(frame)
print(report.summary())

suggestions = ar.suggest_cleaning(frame)
clean = ar.pipeline(frame, suggestions)

For production data contracts:

schema = ar.Schema({
    "id": ar.Int64(nullable=False, unique=True),
    "email": ar.Email(nullable=False),
    "revenue": ar.Float64(nullable=True, min=0),
})

result = ar.validate(frame, schema)
if not result.passed:
    print(result.to_pandas())
    print(result.to_markdown(max_issues=10))

ValidationResult.to_markdown() is useful in CI logs, GitHub comments, or data quality reports because it renders a compact validation summary plus a GitHub-friendly issue table.

For low-risk automatic cleanup:

clean, report = ar.auto_clean(frame, mode="strict", return_report=True)

This is the layer pandas does not try to own: profiling, data contracts, row-level validation issues, and safe cleaning suggestions for messy incoming datasets.


Beginner-friendly auto-clean tutorial

Use this workflow when you receive a small messy dataset and want to inspect what Arnio will change before applying it.

import arnio as ar
import pandas as pd

raw = pd.DataFrame(
    {
        "order_id": [1001, 1002, 1002, 1003, 1004],
        "customer": [" Ishan ", " Prasoon ", " Prasoon ", " Pranay ", " Dhruv "],
        "city": [" Paris ", "London", "London", " New York ", " Tokyo "],
    }
)

frame = ar.from_pandas(raw)

report = ar.profile(frame)
summary = report.summary()
print(summary)

suggestions = ar.suggest_cleaning(frame)
print(suggestions)
# [('strip_whitespace', {'subset': ['customer', 'city']}), ('drop_duplicates', {'keep': 'first'})]

safe = ar.auto_clean(frame)
strict = ar.auto_clean(frame, mode="strict")

Messy input:

order_id customer city
1001 Ishan Paris
1002 Prasoon London
1002 Prasoon London
1003 Pranay New York
1004 Dhruv Tokyo

Expected cleaned output with mode="strict":

order_id customer city
1001 Ishan Paris
1002 Prasoon London
1003 Pranay New York
1004 Dhruv Tokyo

mode="safe" only trims whitespace. Use mode="strict" when you also want deterministic built-in cleanup such as exact duplicate removal.

See examples/auto_clean_tutorial.py for a runnable version of this walkthrough.


Data Quality Reports

Arnio provides detailed profiling for datasets via ar.profile(). To generate the report shown in these examples, the following code was used:

import arnio as ar
import pandas as pd

# Sample dataset used for these examples
data = {
    "user_id": [101, 102, 103, 104],
    "email": ["test@arnio.ai", "invalid-email", None, "test@arnio.ai"],
    "score": [85.5, 90.0, None, 88.2]
}
df = ar.from_pandas(pd.DataFrame(data))
# Bounded profiling for large datasets (controls how many sample values are kept)
report = ar.profile(df, sample_size=5)

1. Terminal Representation (Simplified Example)

A simplified view of the standard string representation of the report object:

DataQualityReport(
    row_count=4,
    column_count=3,
    memory_usage=733,
    duplicate_rows=0,
    columns={
        'user_id': ColumnProfile(dtype='int64', semantic_type='identifier', unique_count=4),
        'email': ColumnProfile(dtype='string', semantic_type='categorical', null_count=1, unique_ratio=0.666667),
        'score': ColumnProfile(dtype='float64', semantic_type='numeric', mean=87.9, min=85.5, max=90.0)
    }
)

2. JSON Format (Excerpts from .to_dict())

Key fields from the structured JSON export for integration with APIs or dashboards:

{
  "row_count": 4,
  "column_count": 3,
  "memory_usage": 733,
  "duplicate_rows": 0,
  "duplicate_ratio": 0.0,
  "columns": {
    "user_id": {
      "dtype": "int64",
      "semantic_type": "identifier",
      "null_count": 0,
      "unique_ratio": 1.0
    },
    "email": {
      "dtype": "string",
      "semantic_type": "categorical",
      "null_count": 1,
      "unique_ratio": 0.666667,
      "warnings": ["contains_nulls"]
    },
    "score": {
      "dtype": "float64",
      "semantic_type": "numeric",
      "null_count": 1,
      "mean": 87.9,
      "min": 85.5,
      "max": 90.0,
      "warnings": ["contains_nulls"]
    }
  }
}

3. Example Summary Table

A manually formatted Markdown table representing the core metrics:

Metric Value
Row Count 4
Column Count 3
Memory Usage 733 bytes
Duplicates 0 (0.0%)

🗺️ Roadmap

Version Focus Status
v1.0 Stable release · cross-platform wheels · CI/CD · PyPI publishing · Google Colab support ✅ Shipped
v1.1 Production readiness · release hardening · docs/tooling ✅ Shipped
v1.2 C++ pipeline optimization · speed parity with pandas · hash-based deduplication 🔨 Active
v1.3 Chunked / streaming processing · Parquet & JSON readers 📋 Planned
v1.4 Parallel column processing · SIMD string operations 💭 Exploring



💬 Community

Join the Arnio Discord Community for quick setup help, contributor onboarding, GSSoC 2026 coordination, feature discussion, and community updates.

Discord is for fast conversation and support. GitHub remains the source of truth for issue assignment, PR reviews, bugs, roadmap decisions, and releases.

Join Arnio Discord




🤝 Contribute

Arnio is a GSSoC 2026 project with a structured contributor backlog across beginner, intermediate, and advanced tracks.

You don't need C++ to contribute

Most new features are pure Python pipeline steps:

# 1. Write a function that takes a DataFrame and returns a DataFrame
def remove_special_chars(df, columns=None):
    cols = columns or df.select_dtypes("object").columns
    for col in cols:
        df[col] = df[col].str.replace(r"[^a-zA-Z0-9\s]", "", regex=True)
    return df

# 2. Register it
ar.register_step("remove_special_chars", remove_special_chars)

# 3. Write tests, open a PR. That's it.

If you do know C++

The biggest performance wins are in:

  • drop_duplicates — replacing std::ostringstream row serialization with proper hash-based comparisons
  • strip_whitespace — converting from copy-on-write to in-place mutation
  • Parallel column processingstd::thread across independent columns

Getting started

# macOS / Linux
git clone https://github.com/im-anishraj/arnio.git && cd arnio
make install   # pip install -e ".[dev]" + pre-commit
make test      # pytest with coverage
make lint      # ruff + black

# Windows
pip install -e ".[dev]"
pre-commit install
pytest tests/ -v

PR titles must follow Conventional Commitsfeat:, fix:, docs:, chore:. Our release pipeline auto-generates changelogs from these.

For GSSoC contributors, please read GSSOC_GUIDE.md before asking to be assigned. It explains issue claiming, contribution levels, review expectations, and what maintainers look for in a strong PR. If you want a quick onboarding refresher, see the GSSoC FAQ. If you are new to Arnio terms, see the contributor glossary.

📖 Full Contributing Guide ·  GSSoC Guide ·  🐛 Open Issues ·  💬 Discussions ·  Discord




🚢 Release process

Arnio releases are automated through Release Please and GitHub Actions.

  1. Merge user-facing changes with Conventional Commit PR titles (feat:, fix:, docs:, or chore:) so Release Please can choose the version bump and changelog entries.
  2. Review and merge the Release Please PR on main; this updates release metadata and creates the GitHub release and tag.
  3. Confirm the Build & Publish Wheels workflow succeeds for the release tag. It builds the sdist and wheels, then publishes to PyPI through Trusted Publishing.
  4. Smoke test the published package in a clean environment:
python -m venv /tmp/arnio-smoke
source /tmp/arnio-smoke/bin/activate
python -m pip install -U pip
python -m pip install arnio
printf 'name,revenue\n Ada,10\n' > /tmp/arnio-smoke.csv
python - <<'PY'
import arnio as ar
print(ar.__version__)
print(ar.scan_csv("/tmp/arnio-smoke.csv"))
PY
  1. Verify the GitHub release, PyPI project page, and install command all show the expected version before announcing the release.

If any publish or smoke-test step fails, leave the failed tag and GitHub release in place until maintainers agree on the recovery plan.




📐 Project structure

arnio/
├── cpp/
│   ├── include/arnio/      # C++ headers — types, column, frame, csv_reader, cleaning
│   └── src/                 # C++ implementations (~30 KB of compiled logic)
├── bindings/
│   └── bind_arnio.cpp       # pybind11 module — the Python↔C++ bridge
├── arnio/
│   ├── __init__.py          # Public API surface
│   ├── io.py                # read_csv, scan_csv
│   ├── cleaning.py          # Python wrappers for C++ cleaning functions
│   ├── pipeline.py          # Step registry + pipeline executor
│   ├── convert.py           # to_pandas (zero-copy), from_pandas
│   ├── frame.py             # ArFrame — lightweight C++ Frame wrapper
│   └── exceptions.py        # ArnioError, UnknownStepError, CsvReadError, TypeCastError
├── tests/                   # pytest suite — CSV, cleaning, pipeline, conversions
├── benchmarks/              # Reproducible arnio vs pandas benchmark
├── examples/                # basic_usage.py, auto_clean_tutorial.py, custom_step.py
└── website/                 # Project website — arnio.vercel.app



Arnio



Stop writing cleaning scripts. Declare clean data.


DownloadsStarsForksWebsiteDiscord


Built with C++ and pybind11 · Licensed under MIT · Maintained by @im-anishraj

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

arnio-1.4.0.tar.gz (2.0 MB view details)

Uploaded Source

Built Distributions

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

arnio-1.4.0-cp313-cp313-win_amd64.whl (199.8 kB view details)

Uploaded CPython 3.13Windows x86-64

arnio-1.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (247.9 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

arnio-1.4.0-cp313-cp313-macosx_11_0_arm64.whl (189.7 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

arnio-1.4.0-cp313-cp313-macosx_10_13_x86_64.whl (205.0 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

arnio-1.4.0-cp312-cp312-win_amd64.whl (199.8 kB view details)

Uploaded CPython 3.12Windows x86-64

arnio-1.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (248.0 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

arnio-1.4.0-cp312-cp312-macosx_11_0_arm64.whl (189.6 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

arnio-1.4.0-cp312-cp312-macosx_10_13_x86_64.whl (204.9 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

arnio-1.4.0-cp311-cp311-win_amd64.whl (197.4 kB view details)

Uploaded CPython 3.11Windows x86-64

arnio-1.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (247.0 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

arnio-1.4.0-cp311-cp311-macosx_11_0_arm64.whl (189.0 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

arnio-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl (203.1 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

arnio-1.4.0-cp310-cp310-win_amd64.whl (196.6 kB view details)

Uploaded CPython 3.10Windows x86-64

arnio-1.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (245.5 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

arnio-1.4.0-cp310-cp310-macosx_11_0_arm64.whl (187.9 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

arnio-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl (201.8 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

arnio-1.4.0-cp39-cp39-win_amd64.whl (203.5 kB view details)

Uploaded CPython 3.9Windows x86-64

arnio-1.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (245.6 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

arnio-1.4.0-cp39-cp39-macosx_11_0_arm64.whl (188.0 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

arnio-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl (201.9 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

File details

Details for the file arnio-1.4.0.tar.gz.

File metadata

  • Download URL: arnio-1.4.0.tar.gz
  • Upload date:
  • Size: 2.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for arnio-1.4.0.tar.gz
Algorithm Hash digest
SHA256 bc010927d995db7e823aa5af46d5fc73e1913ad4eafb6c0a1633725da6c83d12
MD5 b66037d3e3a3a1f06128bcf9019b9751
BLAKE2b-256 5941e4ba01c13837b77f8d0a05a4826c9bc196593ee0966daae94a48896b06f0

See more details on using hashes here.

File details

Details for the file arnio-1.4.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: arnio-1.4.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 199.8 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for arnio-1.4.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 ee6764265ea976e4fd68c3b3ece1e1703aabbb5336d589f322240bf15391e4f0
MD5 4b09ff42c3a5a0f5d2573f76dde9db5e
BLAKE2b-256 21737085c080670b75070f9e8688ee35293f60c894d10fd571bc14151b71b0ac

See more details on using hashes here.

File details

Details for the file arnio-1.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for arnio-1.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5dc0d7f14dc70944bea89111d6ed00b25d1fb7741ebb6661909ae2f92a5b3144
MD5 d6ac8ef43d58e09880670bc583b5a982
BLAKE2b-256 32fe2d415331a75daa1160205ed06a307e25e8852b2b0ed5e5e5c2c09c055d70

See more details on using hashes here.

File details

Details for the file arnio-1.4.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for arnio-1.4.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 40be15aed76577d668e9e796274892e4d2cc12a011f02738a2849f97a465c702
MD5 c5e0fb388b4f1bce94aefd731516a8c6
BLAKE2b-256 595c43b152bc68b3b09e657e283fc7be689e9b45ff6fd6be63be5057ddbf565f

See more details on using hashes here.

File details

Details for the file arnio-1.4.0-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for arnio-1.4.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 2b04da37aabd20c7e6dcfacc1577ca5ebf7e41bb0f6f330e81290b13bdafa422
MD5 4c16cc52ecf40b213adc61f2a821945c
BLAKE2b-256 be1478821164374f07744476276804e0e4930ffc580c9bddbb826c1024693fb6

See more details on using hashes here.

File details

Details for the file arnio-1.4.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: arnio-1.4.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 199.8 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for arnio-1.4.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 e6f168269eac734785dedfbf7ea4c3485ce2003a1dc073663b5a10f2e1cc79b0
MD5 456ef534e18106e4ca4c2d57c947bc51
BLAKE2b-256 5acd7a406c9995a62e8afdd19eea09bbef21cd05aeade8a02ab066528c80a8d7

See more details on using hashes here.

File details

Details for the file arnio-1.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for arnio-1.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b3e269885182923fbd0234466657872aa75208b67db8becd36d36fa2212daa7e
MD5 fc40dfe2b525174114caac7c098dd4b4
BLAKE2b-256 c4daf720bea47e5beed32ef5a67c39f3ab53c67ccad5711e95e9f67f12e8ae64

See more details on using hashes here.

File details

Details for the file arnio-1.4.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for arnio-1.4.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c1a232ed42c4da42d9f6b33b815a61664e0aeb7fb171be451fcb9352657013f7
MD5 ccb436a1c50bcd518ce2157dd09ca3ca
BLAKE2b-256 2fa7313c281226f26ea11950a562ba1205957ffe43d69595d35f1d1b1d76425c

See more details on using hashes here.

File details

Details for the file arnio-1.4.0-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for arnio-1.4.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 364b3429a555912690135dc4c080dfa21c7a3530fa25d9e9232c9974e623910e
MD5 dbcbaef13c0f1d2d9d2a1c154797d782
BLAKE2b-256 06c568173cb07f9bde1d36b2f75f1dbd1bf4dca093f9b19c2b9fe69e45271403

See more details on using hashes here.

File details

Details for the file arnio-1.4.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: arnio-1.4.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 197.4 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for arnio-1.4.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 35d3e35aa2879fe03c35a75c902810ca75bac259fe6cb145f77db1c72256ef17
MD5 d29cde4aa45f8f7f81ca46193b96a2c4
BLAKE2b-256 c3f19ad194c97393120dc563260478340016288fa22d686c596c13eb5ca392f5

See more details on using hashes here.

File details

Details for the file arnio-1.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for arnio-1.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 218fb8bad310edb57fc29b89faf1041d4b036e01577460e34b67a8b030f979b1
MD5 e75eeed9f0de54b06515852ad2c5e7b7
BLAKE2b-256 5ceebdb8010628c983217be08f6e800bd7b25a16c044a523dcf1040034056dd4

See more details on using hashes here.

File details

Details for the file arnio-1.4.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for arnio-1.4.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e8bcfc174e1f213d3357d7439c15182f972b9a55e731849036d2d8ff8545e9b1
MD5 1f6519ff12a23521d39119fc52ccda71
BLAKE2b-256 83f2ab5ad19993e34d6d4cef3dd7c018a24dd3ba4eb44aabc1a94247bf34c555

See more details on using hashes here.

File details

Details for the file arnio-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for arnio-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 b555dd15ef6e25e617455a800ff48cfac1e89d474b1bba35c4d818e9843913ec
MD5 6e7304080d087f90c5ed7e5dd8b9427f
BLAKE2b-256 7819394ebc16b1ae81b7520b9c247ce8b0c41a2adbd37acfed6af631762a44b4

See more details on using hashes here.

File details

Details for the file arnio-1.4.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: arnio-1.4.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 196.6 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for arnio-1.4.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 9f43c6979dbef2c4bd4592a3df72d6bcfdff2ed9abdc7d1dc7d6449c494e261f
MD5 411b557b5cbdb001a373529f7ba9e1c3
BLAKE2b-256 6bd15019171d340cb02220231caeb1db7b67497bf529d5f1899fdb8880575df9

See more details on using hashes here.

File details

Details for the file arnio-1.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for arnio-1.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 44ae79ea2fbdd5858c79d5d6cc3099560770cac926835121c2262c3740cb488a
MD5 7ecbd59fcb27eeb6b299d357e1e4ecae
BLAKE2b-256 48166524ae50f4063ab0db05c974ee243d5931c92ad805b39138363c99c88583

See more details on using hashes here.

File details

Details for the file arnio-1.4.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for arnio-1.4.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7071a28337caa4338383394e1c137a4114a51db1edcacff8af3dd78311dd94bd
MD5 663699a5c59bdbf47308a60abf0487aa
BLAKE2b-256 0225530e5c3718a6db79bb2f3a51dd4a1abf6047afb33cbb6b74e5de708fd1e8

See more details on using hashes here.

File details

Details for the file arnio-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for arnio-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 434dcd8169970bde4015198a1b68919b501aad73f1a268a7bb4d994c9caa9d07
MD5 98b3fcdea610f3b155f32b3acae2f84b
BLAKE2b-256 58d48e79d9b9f7f172a39fc646d9e153190d0a4570c2ef469a8e294f68df746d

See more details on using hashes here.

File details

Details for the file arnio-1.4.0-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: arnio-1.4.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 203.5 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for arnio-1.4.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 1d1a7c885028d9888bc1a0802ddb0206b950cc0f5cd38b6edbe4596dff476f99
MD5 f69bdd2b6bb16bda56567a043d5ea438
BLAKE2b-256 4a9912e0353799fede79a22722f7fad937073c0dfa58992f0df39d65871cf630

See more details on using hashes here.

File details

Details for the file arnio-1.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for arnio-1.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 703668533a6e45921edfbf520eca32401291f22864a4e49689f40f897183afff
MD5 212c87500e293ca686fedae933b660ca
BLAKE2b-256 e0b9cbcecfbc384a692323e2bd079375ddccee56288bd637f4c347367837ea5a

See more details on using hashes here.

File details

Details for the file arnio-1.4.0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

  • Download URL: arnio-1.4.0-cp39-cp39-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 188.0 kB
  • Tags: CPython 3.9, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for arnio-1.4.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4623c7655a3e1f1b92d75631c2f2adb9e0f5e362677e38b84b7cc4f966c9084c
MD5 2dbc3d8cc13345647ccc1c0122a95eda
BLAKE2b-256 8b64bd3c0a282ea7cc73a9619636077e30127b676942d7f3d2c841f85009557f

See more details on using hashes here.

File details

Details for the file arnio-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: arnio-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 201.9 kB
  • Tags: CPython 3.9, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for arnio-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 ea67739349f8c2c3d0c3e6f35c875836a7c8ecec7a94b1e01d4c868a4116cee1
MD5 d8c8cd5ef867ce43af69067349c0d220
BLAKE2b-256 135de707b4482feeeeae8d5f88c98aa6fa53d1cdc8a44bf5972609ef4ef7ab43

See more details on using hashes here.

Supported by

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