Skip to main content

AI-powered Python performance analyzer that detects algorithmic bottlenecks

Project description

LoopSleuth

A Rust-based CLI tool that analyzes Python code for performance issues using local LLM inference.

Installation

Get started in 3 commands:

# 1. Install LoopSleuth
pip install loopsleuth

# 2. Download a model interactively
loopsleuth download-model

# 3. Run analysis!
loopsleuth -m ~/.loopsleuth/models/qwen*.gguf ./src

That's it! The download-model command will show you available models, download your choice to ~/.loopsleuth/models/, and show you how to use it.

Quick Start Guide: See docs/QUICKSTART.md for a complete walkthrough.

Features

  • Fully Configurable: Define checks, customize prompts, and set defaults via TOML configuration file
  • 8 Built-in Performance Checks: Detects multiple types of performance issues beyond just quadratic complexity
  • Parses Python code using Ruff's parser (fast and accurate)
  • Extracts functions from Python modules
  • Analyzes each function using a local LLM (llama.cpp)
  • Supports both single files and entire directories
  • Intelligent caching - Uses SQLite to cache analysis results per check, avoiding redundant LLM calls for unchanged functions
  • Flexible check selection - Run all checks, specific checks, or exclude certain checks

Performance Checks

LoopSleuth includes 8 built-in performance checks:

General Performance

  1. quadratic - Detects O(nยฒ) or worse time complexity (nested loops, etc.)
  2. linear-in-loop - Detects hidden O(n) operations in loops (x in list, .remove(), .index())
  3. n-plus-one - Detects repeated expensive operations in loops (file I/O, network, model loading)
  4. expensive-sort-key - Detects O(n) key functions in sort/sorted operations
  5. unbounded-alloc - Detects growing allocations in loops (string concat, repeated cat)
  6. growing-container - Detects loops that grow containers while iterating

ML-Specific

  1. conversion-churn - Detects repeated CPU/GPU or tensor/array conversions in loops
  2. ml-footguns - Detects ML-specific issues (repeated tokenization, mask rebuilding)

Configuration

LoopSleuth uses a TOML configuration file (loopsleuth.toml) to define performance checks. You can:

  • Customize existing checks
  • Add your own custom checks
  • Modify LLM prompts for better detection
  • Set default CLI options

Configuration File Locations

LoopSleuth looks for configuration in this order:

  1. Path specified with --config flag
  2. ~/.config/loopsleuth/loopsleuth.toml (user config)
  3. Built-in defaults (bundled with the tool)

Configuration Format

[settings]
# Optional: Set default CLI options (can be overridden by command-line flags)
model = "./models/qwen2.5-coder-3b-instruct-q4_k_m.gguf"
threads = 4
max_tokens = 512
context_size = 4096

[[check]]
key = "my-custom-check"
name = "My Custom Check"
description = "Detects my specific performance pattern"
category = "performance"
keyword = "MY_ISSUE"  # Keyword LLM should include if issue detected
detection_prompt = """<|im_start|>system
You are a code analyzer...
Use {function_source} placeholder for the function code.
<|im_end|>
<|im_start|>user
Analyze: {function_source}
<|im_end|>
<|im_start|>assistant
"""
solution_prompt = """<|im_start|>system
Provide solutions...
<|im_end|>
<|im_start|>user
Fix this: {function_source}
<|im_end|>
<|im_start|>assistant
"""

Using Custom Configuration

# Print default config to create your own
loopsleuth --print-default-config > my-loopsleuth.toml

# Edit my-loopsleuth.toml to customize checks or add new ones

# Use your custom config
loopsleuth --config my-loopsleuth.toml -m ~/.loopsleuth/models/qwen*.gguf ./src

# Or place it in ~/.config/loopsleuth/loopsleuth.toml for automatic loading
mkdir -p ~/.config/loopsleuth
cp my-loopsleuth.toml ~/.config/loopsleuth/loopsleuth.toml

Adding Custom Checks

  1. Get the default configuration:

    loopsleuth --print-default-config > ~/.config/loopsleuth/loopsleuth.toml
    
  2. Add a new check section:

    [[check]]
    key = "database-in-loop"
    name = "Database Queries in Loop"
    description = "Detects database queries inside loops"
    category = "performance"
    keyword = "DB_IN_LOOP"
    detection_prompt = """..."""
    solution_prompt = """..."""
    
  3. Run with your custom check:

    loopsleuth -m ~/.loopsleuth/models/qwen*.gguf ./src --checks database-in-loop
    

Model Management

After installation, use these commands to manage models:

# Download a model interactively
loopsleuth download-model

# List downloaded models
loopsleuth list-models

# Use short form
loopsleuth download

Recommended models:

  • Qwen2.5-Coder (3B) โญ - Best for code analysis (~2GB)
  • Devstral Small 2 (24B) - Highest accuracy, requires more RAM (~15GB)
  • Qwen2.5 (3B) - General purpose, good balance (~2GB)
  • Qwen2.5 (0.5B) - Very fast, lower accuracy (~400MB)

The interactive download command will guide you through selecting and downloading the best model for your needs.

Building from Source

For development or if you prefer to build from source:

Prerequisites:

  • Rust toolchain from rustup.rs
  • CMake (brew install cmake on macOS, apt-get install cmake on Linux)
# Clone the repository
git clone https://github.com/tarekziade/loopsleuth.git
cd loopsleuth

# Build the project
cargo build --release

# Download a model
mkdir -p models
pip install huggingface_hub
hf download Qwen/Qwen2.5-Coder-3B-Instruct-GGUF \
  qwen2.5-coder-3b-instruct-q4_k_m.gguf \
  --local-dir ./models

# Run
./target/release/loopsleuth -m ./models/qwen*.gguf ./src

Note: The first build takes several minutes as it compiles llama.cpp from source. Subsequent builds are much faster.

For detailed build instructions and troubleshooting, see docs/PYTHON_INSTALL.md

Usage

Basic Usage

Analyze a single Python file (runs all checks by default):

loopsleuth -m ~/.loopsleuth/models/qwen2.5-coder-3b-instruct-q4_k_m.gguf example.py

Analyze an entire directory (recursive):

loopsleuth -m ~/.loopsleuth/models/qwen*.gguf ./src

The tool automatically finds all .py files in subdirectories and groups results by file.

Check Selection

List all available checks:

loopsleuth --list-checks

Run specific checks only:

loopsleuth -m ~/.loopsleuth/models/qwen*.gguf ./src --checks quadratic,linear-in-loop

Run all checks except specific ones:

loopsleuth -m ~/.loopsleuth/models/qwen*.gguf ./src --exclude conversion-churn,ml-footguns

Note: By default, all 8 checks are run. Use --checks to select specific checks or --exclude to skip certain checks.

Options

Required

  • -m, --model <MODEL> - Path to the GGUF model file (required unless using --list-checks)
  • <PATH> - Path to Python file or directory to analyze (required unless using --list-checks)

Check Selection

  • --list-checks - List all available checks and exit
  • --checks <CHECKS> - Comma-separated list of checks to run (e.g., "quadratic,linear-in-loop")
  • --exclude <CHECKS> - Comma-separated list of checks to exclude from analysis

Configuration

  • --config <FILE> - Path to custom checks configuration file (TOML format)
  • --print-default-config - Print the built-in default configuration and exit

LLM Options

  • -t, --threads <THREADS> - Number of threads for inference (default: 4)
  • --max-tokens <MAX_TOKENS> - Maximum tokens to generate (default: 512)
  • --context-size <SIZE> - Context window size in tokens (default: 4096)
  • -v, --verbose - Show verbose llama.cpp output (useful for debugging)

Output Options

  • -o, --output <FILE> - Save analysis report to markdown file
  • -d, --details - Show detailed report in stdout (always included in file output)
  • --skip-large <N> - Skip functions larger than N lines (0 = no limit)

Cache Options

  • --no-cache - Disable caching (forces re-analysis of all functions)
  • --clear-cache - Clear the cache before running analysis
  • --cache-dir <DIR> - Specify cache directory (default: .loopsleuth_cache)

Note:

  • The tool shows a real-time progress bar with function names and status
  • Cached results are shown with a ๐Ÿ’พ icon for instant retrieval
  • For extremely large functions (>500 lines), consider using --skip-large N
  • If you get "Function too large" warnings, increase --context-size to 8192 or higher

Example

# List all available checks
loopsleuth --list-checks

# Print default configuration
loopsleuth --print-default-config > my-loopsleuth.toml

# Run with custom configuration
loopsleuth --config my-loopsleuth.toml -m ~/.loopsleuth/models/qwen*.gguf ./test_examples/sample.py

# Run all checks (default)
loopsleuth -m ~/.loopsleuth/models/qwen*.gguf ./test_examples/sample.py

# Run specific checks only
loopsleuth -m ~/.loopsleuth/models/qwen*.gguf ./test_examples/sample.py --checks quadratic,linear-in-loop

# Run all except ML-specific checks
loopsleuth -m ~/.loopsleuth/models/qwen*.gguf ./test_examples/sample.py --exclude conversion-churn,ml-footguns

# Full analysis in terminal
loopsleuth -m ~/.loopsleuth/models/qwen*.gguf ./test_examples/sample.py --details

# Save detailed report to file
loopsleuth -m ~/.loopsleuth/models/qwen*.gguf ./test_examples/sample.py --output report.md

For developers: If you're building from source, use cargo run --release -- instead of loopsleuth, or use make example.

Output Format

LoopSleuth provides flexible output for different use cases:

Default: Concise Summary

A quick overview showing:

  • Total functions analyzed
  • Checks run
  • Count of functions with issues (any check)
  • List of issues grouped by function

Perfect for: Quick checks, CI/CD pipelines, daily development

With --details: Full Report to stdout

Each function with issues includes:

  • ๐Ÿ“ Full source code
  • โš ๏ธ Analysis for each detected issue
  • ๐Ÿ’ก Optimization suggestions with examples for each issue

Perfect for: Deep analysis, learning, immediate review

With --output FILE: Save Markdown Report

Generate a complete markdown file that can be:

  • Committed to your repository
  • Attached to pull requests
  • Shared in code reviews
  • Used as documentation

Note: File output always includes full details regardless of --details flag

Sample output:

๐Ÿ”ง Initializing LoopSleuth...
   โš™๏ธ  Setting up LLM backend...
   ๐Ÿ“ฆ Loading model: ./models/qwen2.5-coder-3b-instruct-q4_k_m.gguf...
   โœ… Ready! (context: 4096 tokens)

๐Ÿ” Scanning 1 Python file(s)...
๐Ÿ”ฌ Running 3 check(s): quadratic, linear-in-loop, unbounded-alloc
๐Ÿ“Š Analyzing 4 function(s)...

[โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ] 100% [4/4] | Issues: 3 | ๐Ÿ” [unbounded-alloc] clean_function
โœ… Analysis complete!

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
โ•‘ LOOPSLEUTH ANALYSIS SUMMARY   โ•‘
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

๐Ÿ“Š Total functions analyzed: 4
๐Ÿ” Checks run: 3 (quadratic, linear-in-loop, unbounded-alloc)
โš ๏ธ  Functions with issues: 3
โœ“  Functions clean: 1
๐Ÿ’พ Cache entries: 12 (expected: 12 = 4 functions ร— 3 checks), 8 with issues

๐Ÿ”ด ISSUES DETECTED:
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
  โ€ข quadratic_example (test.py:1)
    - Quadratic Complexity
    - Linear Operations in Loops
    - Unbounded Allocations
  โ€ข linear_in_loop_example (test.py:10)
    - Quadratic Complexity
    - Linear Operations in Loops
  โ€ข string_concat_example (test.py:17)
    - Quadratic Complexity
    - Linear Operations in Loops
    - Unbounded Allocations

๐Ÿ’ก Tip: Use --details to see full analysis or --output FILE to save report

How It Works

  1. File Discovery: Walks through the specified path to find all .py files
  2. Parsing: Uses RustPython's parser to build an AST
  3. Function Extraction: Extracts all function definitions (including class methods)
  4. Check Selection: Determines which checks to run based on CLI flags (default: all 8 checks)
  5. For each function, run all selected checks:
    • Cache Check: Computes SHA256 hash of function source code + check key and checks SQLite cache
      • Cache Hit: Instantly returns cached analysis results (shown with ๐Ÿ’พ icon)
      • Cache Miss: Proceeds to LLM analysis
    • Two-Stage LLM Analysis (per check, when not in cache):
      • Stage 1 - Detection: Constructs a check-specific prompt asking the LLM to analyze for that issue
      • Runs inference using llama.cpp to identify the issue
      • Stage 2 - Solution: If issue detected, makes a second LLM call to:
        • Explain why the code has this issue
        • Propose specific optimization strategies
        • Provide optimized code examples
      • Cache Storage: Stores analysis results in SQLite with composite key (function_hash, check_key)
  6. Reporting: Displays findings grouped by function, showing all detected issues with solutions

Caching Benefits

The intelligent caching system provides significant benefits:

  • Speed: Instant results for unchanged functions (no LLM calls needed)
  • Cost: Saves computation time on repeated analyses
  • Consistency: Same function always gets same analysis (deterministic)
  • Automatic Invalidation: Cache key is based on function source code hash - any code change automatically invalidates cache entry
  • Persistent: Cache survives across runs (stored in .loopsleuth_cache/ by default)
  • Zero Configuration: Works automatically - just run the tool

Example speed improvement:

  • First run on 100 functions with 8 checks: ~40-60 minutes
  • Second run (all cached): ~10-20 seconds
  • Incremental run (95% cached): ~2-5 minutes
  • Single check (quadratic only): ~5-8 minutes first run, instant when cached

Cache behavior:

  • Results cached per (function, check) combination
  • Functions identified by SHA256 hash of source code
  • Changing even a single character in a function invalidates its cache entries for all checks
  • Cache automatically migrates from old single-check schema to new multi-check schema
  • Cache is stored in SQLite database (.loopsleuth_cache/analysis_cache.db)
  • Cache statistics shown in summary: "๐Ÿ’พ Cache entries: X (expected: Y = N functions ร— M checks), Z with issues"

Common Patterns Detected

Performance Issues

  • Quadratic complexity: Nested loops, repeated linear operations
  • Linear-in-loop: x in list, .remove(), .index(), .pop(0) in loops
  • N+1 problem: File I/O, network calls, model loading in loops
  • Expensive sort keys: O(n) key functions in sorting
  • Unbounded allocations: String concatenation, repeated concatenation in loops
  • Growing containers: Appending to lists while iterating

ML-Specific Issues

  • Conversion churn: Repeated .cpu(), .cuda(), .numpy() conversions
  • ML anti-patterns: Repeated tokenization, mask rebuilding, Python loops over tensors

Model Recommendations

Model Size Speed Accuracy Best For
Qwen2.5-Coder (3B) โญ ~2GB Fast Excellent Recommended - Code-specific training
Devstral Small 2 (24B) ~15GB Slower Excellent Production, very detailed analysis
Qwen2.5 (3B) ~2GB Fast Good General purpose
Qwen2.5 (0.5B) ~400MB Very Fast Fair Quick checks, testing

Performance

  • Model loading: ~1-3 seconds (depending on model size)
  • Per-function, per-check analysis (2 LLM calls when issue detected):
    • Detection: ~2-5 seconds
    • Solution proposal: ~3-8 seconds
    • Cached retrieval: <10ms (instant!)
  • Running all 8 checks: ~8x time compared to single check (but only on first run - subsequent runs use cache)
  • The tool processes functions sequentially to manage memory
  • Larger models (24B) provide more detailed and accurate analysis but require more RAM
  • Cache dramatically improves repeated runs: Second analysis on same codebase is ~100x faster
  • Tip: Use --checks to run only the checks you need for faster first-time analysis

Troubleshooting

Large Functions

Symptoms: "Function too large" warnings for very large functions (>500 lines)

Solution: Increase context size to accommodate larger functions

loopsleuth --context-size 8192 -m ~/.loopsleuth/models/qwen*.gguf ./code

Or skip analyzing extremely large functions:

loopsleuth --skip-large 300 -m ~/.loopsleuth/models/qwen*.gguf ./code

Slow Analysis

Symptoms: Takes a while to analyze many functions

This is normal:

  • Each function requires 2 LLM calls per check (detection + solution) if issue found
  • With all 8 checks: expect ~40-80 seconds per function on first run (depending on issues found)
  • With single check: expect ~5-10 seconds per function with 3B model
  • Progress bar shows real-time status with check name and function name
  • Second run is instant if code hasn't changed (cache hit)

To speed up:

  • Use --checks to run only needed checks (e.g., --checks quadratic,linear-in-loop)
  • Use --exclude to skip ML-specific checks if not relevant
  • Use smaller models (Qwen2.5-0.5B) for faster analysis at cost of accuracy
  • Use --skip-large to skip very large functions
  • Let the cache work - subsequent runs are ~100x faster

Out of Memory

Symptoms: System runs out of RAM (rare with default settings)

Solutions:

  • Use smaller model (Qwen2.5-0.5B instead of 3B)
  • Close other memory-intensive applications

License

MIT

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

loopsleuth-0.1.1.tar.gz (63.4 kB view details)

Uploaded Source

Built Distributions

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

loopsleuth-0.1.1-cp314-cp314-win_amd64.whl (3.7 MB view details)

Uploaded CPython 3.14Windows x86-64

loopsleuth-0.1.1-cp314-cp314-manylinux_2_28_x86_64.whl (4.1 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

loopsleuth-0.1.1-cp314-cp314-macosx_11_0_arm64.whl (3.6 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

loopsleuth-0.1.1-cp313-cp313-win_amd64.whl (3.5 MB view details)

Uploaded CPython 3.13Windows x86-64

loopsleuth-0.1.1-cp313-cp313-manylinux_2_28_x86_64.whl (4.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

loopsleuth-0.1.1-cp313-cp313-macosx_11_0_arm64.whl (3.6 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

loopsleuth-0.1.1-cp312-cp312-win_amd64.whl (3.5 MB view details)

Uploaded CPython 3.12Windows x86-64

loopsleuth-0.1.1-cp312-cp312-manylinux_2_28_x86_64.whl (4.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

loopsleuth-0.1.1-cp312-cp312-macosx_11_0_arm64.whl (3.6 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

loopsleuth-0.1.1-cp311-cp311-win_amd64.whl (3.5 MB view details)

Uploaded CPython 3.11Windows x86-64

loopsleuth-0.1.1-cp311-cp311-manylinux_2_28_x86_64.whl (4.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

loopsleuth-0.1.1-cp311-cp311-macosx_11_0_arm64.whl (3.6 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

loopsleuth-0.1.1-cp310-cp310-win_amd64.whl (3.5 MB view details)

Uploaded CPython 3.10Windows x86-64

loopsleuth-0.1.1-cp310-cp310-manylinux_2_28_x86_64.whl (4.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

loopsleuth-0.1.1-cp310-cp310-macosx_11_0_arm64.whl (3.6 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

Details for the file loopsleuth-0.1.1.tar.gz.

File metadata

  • Download URL: loopsleuth-0.1.1.tar.gz
  • Upload date:
  • Size: 63.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for loopsleuth-0.1.1.tar.gz
Algorithm Hash digest
SHA256 8ca2ebe64f0e019421b287bd767758c0096f855a16bc4f454710b249fefb61e9
MD5 1263e7e06a8f73303e3d1cc3f8dd1405
BLAKE2b-256 c0c0e767fa449997f82df95b604a3895e712d5ff64d9d30f965fae0f8c0e61f5

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.1.tar.gz:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loopsleuth-0.1.1-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: loopsleuth-0.1.1-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 3.7 MB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for loopsleuth-0.1.1-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 2584a07ba4a33b004dcc0fe7e2f795150f5fc1ee92ab6188955fd20739df1139
MD5 76f412881c957db970dfd8f810d852e1
BLAKE2b-256 e6a43ed689c838c453dd31153171cea8575b65a613a781ad374f60e194d6af4e

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.1-cp314-cp314-win_amd64.whl:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loopsleuth-0.1.1-cp314-cp314-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for loopsleuth-0.1.1-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b18e21670fd36ae3f52f9d7eb39e5e8de8ebcc6713ca34c7c57ae185ba114993
MD5 55d9ce412174145eee1fbb6c1f994e8c
BLAKE2b-256 a4dae3d82235012c63376490f652cf0b6892c3c963dacaf1443ef358b21165f2

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.1-cp314-cp314-manylinux_2_28_x86_64.whl:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loopsleuth-0.1.1-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for loopsleuth-0.1.1-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 769af32006c83658a93ce86d6548f3909245d964b8aad4d13c3d4f5f290fa334
MD5 bbc07b50c414db30a823a20ac6a267db
BLAKE2b-256 5ebd95c3e349f642dbe4977679e20e5c61d441b3548b037aa71cf0edc0d31693

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.1-cp314-cp314-macosx_11_0_arm64.whl:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loopsleuth-0.1.1-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: loopsleuth-0.1.1-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 3.5 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for loopsleuth-0.1.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 acbbefc3ae835834f999c6a4487dcea13e7667a7dfd7a9dedd7cebad90d90f75
MD5 7caad9c6394437598a3e7c255a150ebd
BLAKE2b-256 bbfa2308e78791cb757da7b8f8b3ea011f81f44fad34cda9f2e1b3d347875982

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.1-cp313-cp313-win_amd64.whl:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loopsleuth-0.1.1-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for loopsleuth-0.1.1-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 adbba24b063e550f4447bf40b8b1527d716f88f765ebcfa508e36e806c30ee8a
MD5 448c0cdf24f9994017314bbe8b1a074d
BLAKE2b-256 a2d69c7c22de4621527139e2ffdca86d04f3121eb65c3fb0c6d9eb8994c2c90b

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.1-cp313-cp313-manylinux_2_28_x86_64.whl:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loopsleuth-0.1.1-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for loopsleuth-0.1.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fd5ba9415f3750861038c64a91ff3ee55f511e99509a21b61fe6bec6bece9738
MD5 8020653eed023321f400f3d07e279825
BLAKE2b-256 f46b755f18f6ab703ad1f8aa9092107c00d3c1236b9dc279a45e3bac204544a8

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.1-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loopsleuth-0.1.1-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: loopsleuth-0.1.1-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 3.5 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for loopsleuth-0.1.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 c0e345333c0e8135d55eb3be2623a8d4b9a09988690e3f7bcff3552e5437ac40
MD5 d844b04d3324b48009ef8cfd86b3b7cd
BLAKE2b-256 0926056308a6f70baa4ae4fa1b758780d5b2a22343a0eec00f0154d28efefead

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.1-cp312-cp312-win_amd64.whl:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loopsleuth-0.1.1-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for loopsleuth-0.1.1-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4cb428e4a4998fd995d4a68e775e8f0ba951c6fd5f82308e02845c26a7f46c3d
MD5 b78ccdfb3db959aabbc8deccef326960
BLAKE2b-256 531bb7d8e1c65d44463e4dbf10a36243383c849f93a04e97bb9e7b3aa30a2dde

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.1-cp312-cp312-manylinux_2_28_x86_64.whl:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loopsleuth-0.1.1-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for loopsleuth-0.1.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a9488078c124fcf6c84d5d90c9c7df19b21db0bfc239e9bdbb479985b2fe220f
MD5 7c6eb097ebf24ed732583ca2ef9a7bf7
BLAKE2b-256 dff06b7e911d6d68a984736e97d1194ecfa87d9889863f532298fc0a17c02083

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.1-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loopsleuth-0.1.1-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: loopsleuth-0.1.1-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 3.5 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for loopsleuth-0.1.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 42f4851ee94f8045a31ecd7fa0043b594607f4187072a044ebadf9be6b1fa703
MD5 bd99334e1c94c5e36c03e23c04512cf9
BLAKE2b-256 d26ba994908576811fb31e6e32065f5000b1aeb394104395db8f69705709e9e4

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.1-cp311-cp311-win_amd64.whl:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loopsleuth-0.1.1-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for loopsleuth-0.1.1-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6e2e65e035952d2a31e4e9f056918779b4b16e9066cd6d3196c16dbe9d6a618e
MD5 6f6095e34838b74bb139b4d9bf4c26a7
BLAKE2b-256 3dda5cc23907106a4d23e97a5af6544131fc79c239f9d5d75fa2297eb7b02375

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.1-cp311-cp311-manylinux_2_28_x86_64.whl:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loopsleuth-0.1.1-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for loopsleuth-0.1.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 64fe380c9572eccacf0b0cacff4fe1f0b5d36740377ca659d515c1e49e404913
MD5 a1ad94c14ab78ff2bdac8bec7c1d20bc
BLAKE2b-256 bc22ca239f97c619844a613cb876efebec4822574bb4778645b9fc23439580d4

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.1-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loopsleuth-0.1.1-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: loopsleuth-0.1.1-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 3.5 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for loopsleuth-0.1.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 49622398de0faf5c168183c541a8485360cf3997383e98bcfae09fa34bbae08e
MD5 3a73925e26af2705cdaf96c456a600bc
BLAKE2b-256 629a077bc09f287dcc42523ef2d166f1e2c3f0dfd6c5d7fe28332ae396025ab6

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.1-cp310-cp310-win_amd64.whl:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loopsleuth-0.1.1-cp310-cp310-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for loopsleuth-0.1.1-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 0ca09382f11c3c16dc80e2ff76d60962eeeeaf6fb404e8dff7387d6e35ed2836
MD5 f88dfd82da80c24a76437176d19fc360
BLAKE2b-256 6ab5d71d2925d5d86a83bcdfe3089087394b35e1fc5edacfcaf4feeaa9401b86

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.1-cp310-cp310-manylinux_2_28_x86_64.whl:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loopsleuth-0.1.1-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for loopsleuth-0.1.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e7f46fd50d89f3c87510b3e03dc327fa5aa56564d038a228db7c8e688e0a8ef7
MD5 cc866fe70bfb81ae9ce4ed90b3207105
BLAKE2b-256 cc44daa241d2a7fa4adf4ec14d74b660a23480f11764baa2072a225ef30a6c95

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.1-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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