Skip to content

Conversation

codeflash-ai[bot]
Copy link

@codeflash-ai codeflash-ai bot commented Oct 22, 2025

📄 278% (2.78x) speedup for AmazonStabilityConfig.get_config in litellm/llms/bedrock/image/amazon_stability1_transformation.py

⏱️ Runtime : 3.85 milliseconds 1.02 milliseconds (best of 345 runs)

📝 Explanation and details

The optimization achieves a 277% speedup by eliminating expensive dictionary operations and type checking in the hot path:

Key optimizations:

  1. Replaced locals() dictionary copying in __init__: The original code created a copy of the entire locals dictionary and iterated through it. The optimized version uses direct conditional checks for each parameter, avoiding dictionary creation and iteration overhead.

  2. Eliminated cls.__dict__.items() iteration in get_config: The original code iterated through the entire class dictionary and performed expensive isinstance checks against multiple function types for every attribute. The optimized version uses a predefined tuple of known attribute names and directly accesses only those attributes with getattr.

  3. Removed repeated type checking: The original performed isinstance checks against types.FunctionType, types.BuiltinFunctionType, classmethod, and staticmethod for every class attribute. The optimization leverages domain knowledge that this class only uses the five configuration attributes, eliminating all type checking.

Why this works so well:

  • Dictionary operations (locals().copy(), cls.__dict__.items()) are expensive in Python
  • Type checking with isinstance against multiple types has significant overhead when called repeatedly
  • Direct attribute access with getattr is much faster than dictionary iteration
  • The optimization is safe because the class has a fixed, known set of configuration attributes

Test case performance:
The optimization shows consistent 150-300% speedups across all test scenarios, with particularly strong performance in high-frequency calls (500+ iterations showing 285-308% speedups) and scenarios with multiple parameters set.

Correctness verification report:

Test Status
⚙️ Existing Unit Tests 🔘 None Found
🌀 Generated Regression Tests 2060 Passed
⏪ Replay Tests 🔘 None Found
🔎 Concolic Coverage Tests 🔘 None Found
📊 Tests Coverage 100.0%
🌀 Generated Regression Tests and Runtime
import types
from typing import List, Optional

# imports
import pytest
from litellm.llms.bedrock.image.amazon_stability1_transformation import \
    AmazonStabilityConfig

# unit tests

# ---- BASIC TEST CASES ----

def test_get_config_empty():
    """
    Test that get_config returns an empty dict when no values have been set.
    """
    # Reset all class attributes to None
    AmazonStabilityConfig.cfg_scale = None
    AmazonStabilityConfig.seed = None
    AmazonStabilityConfig.steps = None
    AmazonStabilityConfig.width = None
    AmazonStabilityConfig.height = None
    codeflash_output = AmazonStabilityConfig.get_config() # 4.07μs -> 1.28μs (218% faster)

def test_get_config_single_value():
    """
    Test that get_config returns a dict with a single key/value when one value is set.
    """
    AmazonStabilityConfig.cfg_scale = None
    AmazonStabilityConfig.seed = None
    AmazonStabilityConfig.steps = None
    AmazonStabilityConfig.width = None
    AmazonStabilityConfig.height = None

    AmazonStabilityConfig(cfg_scale=10)
    codeflash_output = AmazonStabilityConfig.get_config() # 3.96μs -> 1.31μs (203% faster)

def test_get_config_multiple_values():
    """
    Test that get_config returns all set values.
    """
    AmazonStabilityConfig.cfg_scale = None
    AmazonStabilityConfig.seed = None
    AmazonStabilityConfig.steps = None
    AmazonStabilityConfig.width = None
    AmazonStabilityConfig.height = None

    AmazonStabilityConfig(cfg_scale=15, seed=123.0, width=256)
    codeflash_output = AmazonStabilityConfig.get_config(); result = codeflash_output # 4.05μs -> 1.56μs (160% faster)

def test_get_config_overwrite_value():
    """
    Test that setting a value again overwrites the previous value.
    """
    AmazonStabilityConfig.cfg_scale = None
    AmazonStabilityConfig(cfg_scale=5)
    AmazonStabilityConfig(cfg_scale=30)

def test_get_config_steps_list():
    """
    Test that get_config can handle a list for 'steps'.
    """
    AmazonStabilityConfig.steps = None
    steps_val = ["20", "30", "40"]
    AmazonStabilityConfig(steps=steps_val)

def test_get_config_height_and_width():
    """
    Test that get_config returns both height and width when both are set.
    """
    AmazonStabilityConfig.height = None
    AmazonStabilityConfig.width = None
    AmazonStabilityConfig(height=512, width=768)
    codeflash_output = AmazonStabilityConfig.get_config(); config = codeflash_output # 4.62μs -> 1.64μs (183% faster)

# ---- EDGE TEST CASES ----

def test_get_config_zero_and_maximum_values():
    """
    Test get_config with edge values for numeric parameters.
    """
    AmazonStabilityConfig.cfg_scale = None
    AmazonStabilityConfig.seed = None
    AmazonStabilityConfig.steps = None
    AmazonStabilityConfig.width = None
    AmazonStabilityConfig.height = None

    AmazonStabilityConfig(cfg_scale=0, seed=0.0, width=128, height=128, steps=["10"])
    codeflash_output = AmazonStabilityConfig.get_config(); config = codeflash_output # 4.25μs -> 1.68μs (153% faster)

    # Test upper bounds
    AmazonStabilityConfig(cfg_scale=35, seed=4294967295.0, width=1536, height=1536, steps=["50"])
    codeflash_output = AmazonStabilityConfig.get_config(); config = codeflash_output # 2.89μs -> 1.00μs (188% faster)

def test_get_config_steps_empty_list():
    """
    Test get_config with steps as an empty list.
    """
    AmazonStabilityConfig.steps = None
    AmazonStabilityConfig(steps=[])
    codeflash_output = AmazonStabilityConfig.get_config(); config = codeflash_output # 4.35μs -> 1.54μs (182% faster)

def test_get_config_steps_string_elements():
    """
    Test get_config with steps as a list of strings with non-numeric values.
    """
    AmazonStabilityConfig.steps = None
    AmazonStabilityConfig(steps=["foo", "bar"])
    codeflash_output = AmazonStabilityConfig.get_config(); config = codeflash_output # 4.35μs -> 1.55μs (181% faster)

def test_get_config_unset_after_set():
    """
    Test that setting a value and then resetting to None removes it from get_config.
    """
    AmazonStabilityConfig.cfg_scale = 10
    codeflash_output = AmazonStabilityConfig.get_config() # 4.43μs -> 1.51μs (193% faster)
    AmazonStabilityConfig.cfg_scale = None
    codeflash_output = AmazonStabilityConfig.get_config() # 2.89μs -> 1.02μs (182% faster)

def test_get_config_non_default_types():
    """
    Test that get_config ignores attributes that are not of the specified types.
    """
    # Add a bogus attribute to the class
    AmazonStabilityConfig.bogus = lambda x: x
    codeflash_output = AmazonStabilityConfig.get_config(); config = codeflash_output # 4.72μs -> 1.50μs (216% faster)
    # Clean up
    delattr(AmazonStabilityConfig, "bogus")

def test_get_config_class_attribute_leakage():
    """
    Test that get_config does not leak special or method attributes.
    """
    codeflash_output = AmazonStabilityConfig.get_config(); config = codeflash_output # 4.33μs -> 1.52μs (184% faster)
    for k in config:
        pass

# ---- LARGE SCALE TEST CASES ----

def test_get_config_large_steps_list():
    """
    Test get_config with a large steps list.
    """
    steps_val = [str(i) for i in range(1000)]
    AmazonStabilityConfig.steps = None
    AmazonStabilityConfig(steps=steps_val)
    codeflash_output = AmazonStabilityConfig.get_config(); config = codeflash_output # 4.37μs -> 1.55μs (181% faster)

def test_get_config_many_set_unset_cycles():
    """
    Test robustness under repeated set/unset cycles.
    """
    for i in range(100):
        AmazonStabilityConfig.cfg_scale = None
        AmazonStabilityConfig(seed=None)
        AmazonStabilityConfig(cfg_scale=i)
        codeflash_output = AmazonStabilityConfig.get_config(); config = codeflash_output # 258μs -> 73.6μs (251% faster)
        AmazonStabilityConfig.cfg_scale = None
        codeflash_output = AmazonStabilityConfig.get_config()

def test_get_config_all_fields_large_values():
    """
    Test get_config with all fields set to large but valid values.
    """
    steps_val = [str(i) for i in range(999)]
    AmazonStabilityConfig.cfg_scale = None
    AmazonStabilityConfig.seed = None
    AmazonStabilityConfig.steps = None
    AmazonStabilityConfig.width = None
    AmazonStabilityConfig.height = None

    AmazonStabilityConfig(cfg_scale=35, seed=4294967295.0, width=1536, height=1536, steps=steps_val)
    codeflash_output = AmazonStabilityConfig.get_config(); config = codeflash_output # 4.22μs -> 1.54μs (174% faster)

def test_get_config_performance_many_calls():
    """
    Test that repeated calls to get_config are consistent and performant.
    """
    AmazonStabilityConfig.cfg_scale = None
    AmazonStabilityConfig(cfg_scale=10)
    for _ in range(500):
        codeflash_output = AmazonStabilityConfig.get_config(); config = codeflash_output # 1.23ms -> 320μs (285% faster)
    AmazonStabilityConfig.cfg_scale = None
    for _ in range(500):
        codeflash_output = AmazonStabilityConfig.get_config(); config = codeflash_output # 1.23ms -> 301μs (308% faster)
# codeflash_output is used to check that the output of the original code is the same as that of the optimized code.
#------------------------------------------------
import types
from typing import List, Optional

# imports
import pytest
from litellm.llms.bedrock.image.amazon_stability1_transformation import \
    AmazonStabilityConfig

# unit tests

# --- BASIC TEST CASES ---

def test_get_config_empty():
    """
    Test get_config on a fresh class with all defaults (all None).
    Should return an empty dict.
    """
    # Reset class variables to None to avoid test pollution
    AmazonStabilityConfig.cfg_scale = None
    AmazonStabilityConfig.seed = None
    AmazonStabilityConfig.steps = None
    AmazonStabilityConfig.width = None
    AmazonStabilityConfig.height = None
    codeflash_output = AmazonStabilityConfig.get_config() # 4.64μs -> 1.41μs (230% faster)

def test_get_config_single_param():
    """
    Test setting a single parameter and checking get_config output.
    """
    # Reset class variables
    AmazonStabilityConfig.cfg_scale = None
    AmazonStabilityConfig.seed = None
    AmazonStabilityConfig.steps = None
    AmazonStabilityConfig.width = None
    AmazonStabilityConfig.height = None

    # Set only cfg_scale
    AmazonStabilityConfig(cfg_scale=10)
    codeflash_output = AmazonStabilityConfig.get_config(); config = codeflash_output # 4.08μs -> 1.36μs (199% faster)

def test_get_config_multiple_params():
    """
    Test setting multiple parameters and checking get_config output.
    """
    # Reset class variables
    AmazonStabilityConfig.cfg_scale = None
    AmazonStabilityConfig.seed = None
    AmazonStabilityConfig.steps = None
    AmazonStabilityConfig.width = None
    AmazonStabilityConfig.height = None

    AmazonStabilityConfig(cfg_scale=5, seed=123.0, width=512)
    codeflash_output = AmazonStabilityConfig.get_config(); config = codeflash_output # 4.31μs -> 1.60μs (170% faster)

def test_get_config_steps_list():
    """
    Test setting steps as a list of strings.
    """
    # Reset class variables
    AmazonStabilityConfig.cfg_scale = None
    AmazonStabilityConfig.seed = None
    AmazonStabilityConfig.steps = None
    AmazonStabilityConfig.width = None
    AmazonStabilityConfig.height = None

    steps_list = ["10", "20", "30"]
    AmazonStabilityConfig(steps=steps_list)
    codeflash_output = AmazonStabilityConfig.get_config(); config = codeflash_output # 4.10μs -> 1.39μs (195% faster)

def test_get_config_overwrites_previous():
    """
    Test that setting a parameter overwrites any previous value for the class.
    """
    # Reset class variables
    AmazonStabilityConfig.cfg_scale = None
    AmazonStabilityConfig.seed = None
    AmazonStabilityConfig.steps = None
    AmazonStabilityConfig.width = None
    AmazonStabilityConfig.height = None

    AmazonStabilityConfig(cfg_scale=1)
    codeflash_output = AmazonStabilityConfig.get_config() # 4.06μs -> 1.44μs (183% faster)
    AmazonStabilityConfig(cfg_scale=2)
    codeflash_output = AmazonStabilityConfig.get_config() # 2.74μs -> 783ns (249% faster)

# --- EDGE TEST CASES ---

def test_get_config_zero_and_boundary_values():
    """
    Test boundary values for cfg_scale, seed, width, height.
    """
    # Reset class variables
    AmazonStabilityConfig.cfg_scale = None
    AmazonStabilityConfig.seed = None
    AmazonStabilityConfig.steps = None
    AmazonStabilityConfig.width = None
    AmazonStabilityConfig.height = None

    AmazonStabilityConfig(cfg_scale=0, seed=0.0, width=128, height=128)
    codeflash_output = AmazonStabilityConfig.get_config(); config = codeflash_output # 4.45μs -> 1.60μs (178% faster)

def test_get_config_maximum_values():
    """
    Test maximum allowed values for each parameter.
    """
    # Reset class variables
    AmazonStabilityConfig.cfg_scale = None
    AmazonStabilityConfig.seed = None
    AmazonStabilityConfig.steps = None
    AmazonStabilityConfig.width = None
    AmazonStabilityConfig.height = None

    AmazonStabilityConfig(cfg_scale=35, seed=4294967295.0, width=1536, height=1536)
    codeflash_output = AmazonStabilityConfig.get_config(); config = codeflash_output # 4.22μs -> 1.56μs (171% faster)

def test_get_config_steps_empty_list():
    """
    Test setting steps to an empty list.
    """
    # Reset class variables
    AmazonStabilityConfig.cfg_scale = None
    AmazonStabilityConfig.seed = None
    AmazonStabilityConfig.steps = None
    AmazonStabilityConfig.width = None
    AmazonStabilityConfig.height = None

    AmazonStabilityConfig(steps=[])
    codeflash_output = AmazonStabilityConfig.get_config(); config = codeflash_output # 4.13μs -> 1.35μs (206% faster)

def test_get_config_none_param_removal():
    """
    Test that setting a param to None removes it from the config.
    """
    # Reset class variables
    AmazonStabilityConfig.cfg_scale = 10
    AmazonStabilityConfig.seed = 5.0
    AmazonStabilityConfig.steps = ["10"]
    AmazonStabilityConfig.width = 512
    AmazonStabilityConfig.height = 512

    AmazonStabilityConfig(cfg_scale=None, seed=None, steps=None, width=None, height=None)
    codeflash_output = AmazonStabilityConfig.get_config(); config = codeflash_output # 4.35μs -> 1.63μs (167% faster)

def test_get_config_type_variance():
    """
    Test setting parameters to different types (int, float, list).
    """
    # Reset class variables
    AmazonStabilityConfig.cfg_scale = None
    AmazonStabilityConfig.seed = None
    AmazonStabilityConfig.steps = None
    AmazonStabilityConfig.width = None
    AmazonStabilityConfig.height = None

    AmazonStabilityConfig(cfg_scale=7, seed=3.14, steps=["15", "30"], width=256, height=512)
    codeflash_output = AmazonStabilityConfig.get_config(); config = codeflash_output # 4.25μs -> 1.60μs (165% faster)

def test_get_config_repeated_calls_consistency():
    """
    Test that repeated calls to get_config return the same result if no changes are made.
    """
    # Reset class variables
    AmazonStabilityConfig.cfg_scale = None
    AmazonStabilityConfig.seed = None
    AmazonStabilityConfig.steps = None
    AmazonStabilityConfig.width = None
    AmazonStabilityConfig.height = None

    AmazonStabilityConfig(cfg_scale=3, width=640)
    codeflash_output = AmazonStabilityConfig.get_config(); config1 = codeflash_output # 4.09μs -> 1.48μs (176% faster)
    codeflash_output = AmazonStabilityConfig.get_config(); config2 = codeflash_output # 2.92μs -> 917ns (218% faster)

def test_get_config_class_vs_instance():
    """
    Test that config is stored at the class level, not per-instance.
    """
    # Reset class variables
    AmazonStabilityConfig.cfg_scale = None
    AmazonStabilityConfig.seed = None
    AmazonStabilityConfig.steps = None
    AmazonStabilityConfig.width = None
    AmazonStabilityConfig.height = None

    inst1 = AmazonStabilityConfig(cfg_scale=8)
    inst2 = AmazonStabilityConfig(seed=42.0)
    # Both values should be present at the class level
    codeflash_output = AmazonStabilityConfig.get_config(); config = codeflash_output # 4.04μs -> 1.48μs (174% faster)

def test_get_config_static_and_classmethod_not_included():
    """
    Test that static and class methods are not included in the config.
    """
    # Reset class variables
    AmazonStabilityConfig.cfg_scale = None
    AmazonStabilityConfig.seed = None
    AmazonStabilityConfig.steps = None
    AmazonStabilityConfig.width = None
    AmazonStabilityConfig.height = None

    AmazonStabilityConfig(cfg_scale=9)
    codeflash_output = AmazonStabilityConfig.get_config(); config = codeflash_output # 4.00μs -> 1.28μs (212% faster)

# --- LARGE SCALE TEST CASES ---

def test_get_config_large_steps_list():
    """
    Test get_config with a large list for steps.
    """
    # Reset class variables
    AmazonStabilityConfig.cfg_scale = None
    AmazonStabilityConfig.seed = None
    AmazonStabilityConfig.steps = None
    AmazonStabilityConfig.width = None
    AmazonStabilityConfig.height = None

    steps_list = [str(i) for i in range(1000)]
    AmazonStabilityConfig(steps=steps_list)
    codeflash_output = AmazonStabilityConfig.get_config(); config = codeflash_output # 4.12μs -> 1.38μs (198% faster)

def test_get_config_stress_many_assignments():
    """
    Test repeated assignments to class variables to check for memory leaks or state pollution.
    """
    # Reset class variables
    AmazonStabilityConfig.cfg_scale = None
    AmazonStabilityConfig.seed = None
    AmazonStabilityConfig.steps = None
    AmazonStabilityConfig.width = None
    AmazonStabilityConfig.height = None

    for i in range(100):
        AmazonStabilityConfig(cfg_scale=i, seed=float(i), width=128+i*4, height=128+i*4)
        codeflash_output = AmazonStabilityConfig.get_config(); config = codeflash_output # 251μs -> 70.1μs (259% faster)

def test_get_config_all_params_large_values():
    """
    Test get_config with all parameters set to their largest allowed values.
    """
    # Reset class variables
    AmazonStabilityConfig.cfg_scale = None
    AmazonStabilityConfig.seed = None
    AmazonStabilityConfig.steps = None
    AmazonStabilityConfig.width = None
    AmazonStabilityConfig.height = None

    steps_list = [str(i) for i in range(10, 51)]
    AmazonStabilityConfig(
        cfg_scale=35,
        seed=4294967295.0,
        steps=steps_list,
        width=1536,
        height=1536,
    )
    codeflash_output = AmazonStabilityConfig.get_config(); config = codeflash_output # 4.22μs -> 1.60μs (163% faster)

def test_get_config_large_scale_toggle_params():
    """
    Repeatedly toggle parameters between None and a value to test stability.
    """
    # Reset class variables
    AmazonStabilityConfig.cfg_scale = None
    AmazonStabilityConfig.seed = None
    AmazonStabilityConfig.steps = None
    AmazonStabilityConfig.width = None
    AmazonStabilityConfig.height = None

    for i in range(100):
        # Set all params
        AmazonStabilityConfig(cfg_scale=i, seed=float(i), steps=[str(i)], width=128+i*4, height=128+i*4)
        codeflash_output = AmazonStabilityConfig.get_config(); config = codeflash_output # 252μs -> 73.7μs (242% faster)

        # Remove all params
        AmazonStabilityConfig(cfg_scale=None, seed=None, steps=None, width=None, height=None)
        codeflash_output = AmazonStabilityConfig.get_config(); config = codeflash_output # 249μs -> 66.7μs (274% faster)
# codeflash_output is used to check that the output of the original code is the same as that of the optimized code.
#------------------------------------------------
from litellm.llms.bedrock.image.amazon_stability1_transformation import AmazonStabilityConfig

To edit these changes git checkout codeflash/optimize-AmazonStabilityConfig.get_config-mh2lilwz and push.

Codeflash

The optimization achieves a **277% speedup** by eliminating expensive dictionary operations and type checking in the hot path:

**Key optimizations:**

1. **Replaced `locals()` dictionary copying in `__init__`**: The original code created a copy of the entire locals dictionary and iterated through it. The optimized version uses direct conditional checks for each parameter, avoiding dictionary creation and iteration overhead.

2. **Eliminated `cls.__dict__.items()` iteration in `get_config`**: The original code iterated through the entire class dictionary and performed expensive `isinstance` checks against multiple function types for every attribute. The optimized version uses a predefined tuple of known attribute names and directly accesses only those attributes with `getattr`.

3. **Removed repeated type checking**: The original performed `isinstance` checks against `types.FunctionType`, `types.BuiltinFunctionType`, `classmethod`, and `staticmethod` for every class attribute. The optimization leverages domain knowledge that this class only uses the five configuration attributes, eliminating all type checking.

**Why this works so well:**
- Dictionary operations (`locals().copy()`, `cls.__dict__.items()`) are expensive in Python
- Type checking with `isinstance` against multiple types has significant overhead when called repeatedly
- Direct attribute access with `getattr` is much faster than dictionary iteration
- The optimization is safe because the class has a fixed, known set of configuration attributes

**Test case performance:**
The optimization shows consistent 150-300% speedups across all test scenarios, with particularly strong performance in high-frequency calls (500+ iterations showing 285-308% speedups) and scenarios with multiple parameters set.
@codeflash-ai codeflash-ai bot requested a review from mashraf-222 October 22, 2025 22:59
@codeflash-ai codeflash-ai bot added the ⚡️ codeflash Optimization PR opened by Codeflash AI label Oct 22, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

⚡️ codeflash Optimization PR opened by Codeflash AI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants