Skip to content

Import Performance Tools Usage GuideΒΆ

🎯 Goal¢

Prevent future issues with slow imports and circular dependencies.

πŸ“¦ Installed ToolsΒΆ

1. Circular Import DetectionΒΆ

# Detect all circular imports
make check-circular

# Or run directly
python scripts/detect_circular_imports.py

Output example:

βœ… No circular imports detected!

2. Heavy Import DetectionΒΆ

# Check all Python files
make check-heavy

# Or check specific files
python scripts/check_heavy_imports.py src/apflow/cli/commands/*.py

Will warn about these heavyweight libraries: - litellm (2.4s) - crewai (5.4s) - torch, transformers, tensorflow, langchain

3. Import Performance AnalysisΒΆ

# Full performance report
make check-performance

# Or use Python's built-in tool directly
python -X importtime -c "import apflow.cli.main" 2>&1 | grep apflow

4. One-Click Check AllΒΆ

make check-imports

πŸ”§ Pre-commit HooksΒΆ

Automatically configured checks that run before every commit:

# Install (first time only)
pip install pre-commit
pre-commit install

# Now every git commit will automatically check:
# βœ“ Circular imports
# βœ“ Heavyweight module-level imports
# βœ“ Code formatting (ruff)

πŸš€ CI/CD Automatic ChecksΒΆ

Every PR will automatically verify: - βœ“ Circular import detection - βœ“ CLI startup time < 1.5 seconds - βœ“ No heavyweight dependencies loaded at CLI startup

See .github/workflows/import-performance.yml

πŸ“š Development GuidelinesΒΆ

❌ Avoid These Mistakes¢

  1. Module-level heavyweight imports

    # ❌ BAD: In CLI files
    import litellm  # Slows down startup!
    
    def list_tasks():
        ...  # Doesn't even use litellm
    

  2. Package __init__.py Eager Imports

    # ❌ BAD: package/__init__.py
    from .heavy_module import HeavyClass  # Loads everything immediately!
    

  3. Automatically importing all Extensions

    # ❌ BAD
    import apflow.extensions  # Loads all executors at module level
    

βœ… Correct PracticesΒΆ

  1. Import on Demand

    # βœ… GOOD
    def execute_llm_task():
        import litellm  # Import only when needed
        ...
    

  2. Lazy Loading for Packages

    # βœ… GOOD: package/__init__.py
    def __getattr__(name):
        if name == "HeavyClass":
            from .heavy_module import HeavyClass
            return HeavyClass
        raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
    

  3. Registry Lazy Loading

    # βœ… GOOD
    def get_registry():
        global _extensions_loaded
        if not _extensions_loaded:
            import apflow.extensions  # Load only on first access
        return _registry
    

tuna - Visualize Import TimeΒΆ

pip install tuna
python -X importtime -c "import apflow" 2> import.log
tuna import.log  # Opens browser with visual chart

pydeps - Dependency GraphΒΆ

pip install pydeps graphviz
pydeps apflow --max-bacon=2 -o deps.png
open deps.png

import-profilerΒΆ

pip install import-profiler
python -m import_profiler apflow.cli.main

πŸ“Š Performance BenchmarksΒΆ

Current metrics: - βœ… CLI startup: 1.3 seconds (target < 1.5 seconds) - βœ… import apflow.core: 0.8 seconds - βœ… import apflow.cli.main: 0.7 seconds - βœ… Zero circular imports

Historical comparison: - Before optimization: 7.0 seconds 😱 - After optimization: 1.3 seconds ✨ - Improvement: 5.4Γ— πŸš€

πŸ› οΈ Daily UsageΒΆ

Before Developing a New FeatureΒΆ

# Check current baseline
time python -c "import apflow.cli.main"

After Finishing DevelopmentΒΆ

# Run all checks
make check-imports

# Or individual checks
make check-circular
make check-performance
make check-heavy

Git CommitΒΆ

git add .
git commit -m "feat: new feature"
# Pre-commit hooks run checks automatically

When Encountering WarningsΒΆ

Read docs/development/import-performance.md for detailed fix solutions.

πŸŽ“ Learning ResourcesΒΆ

πŸ’‘ RememberΒΆ

"If it takes more than 1 second to run --help, it's too slow."

Import performance directly affects user experience. Stay vigilant and avoid: 1. Module-level heavyweight imports 2. Eager loading of all modules 3. Circular dependencies

Use these tools to continuously monitor! 🎯