langflow
langflow copied to clipboard
⚡️ Speed up function `_build_output_function` by 10% in PR #6981 (`data-to-json`)
⚡️ This pull request contains optimizations for PR #6981
If you approve this dependent PR, these changes will be merged into the original PR branch data-to-json.
This PR will be automatically closed if the original PR is merged.
📄 10% (0.10x) speedup for _build_output_function in src/backend/base/langflow/base/tools/component_tool.py
⏱️ Runtime : 60.9 microseconds → 55.3 microseconds (best of 81 runs)
📝 Explanation and details
Below is the optimized version of the provided Python code, focusing on improving its runtime and memory efficiency.
Changes made.
- Introduced a no-op function: Added
send_message_noopfunction to handle the no-operation on thesend_message. - Introduced a context manager: Created
_temporary_patch_send_messageclass to use the context manager for temporarily patching thesend_messagemethod. This reduces the repeated code for patching and unpatching. - Removed redundant try-finally in decorator: The use of the context manager avoids duplicating the try-finally block in the decorator for asynchronous and synchronous methods.
- Reordered the event handling: Combined the try block and the final check for
event_managerinto single points, ensuring we do not stretch the try block too far.
The provided code now is more succinct, maintainable, easier to read, and can be efficiently managed.
✅ Correctness verification report:
| Test | Status |
|---|---|
| ⚙️ Existing Unit Tests | 🔘 None Found |
| 🌀 Generated Regression Tests | ✅ 13 Passed |
| ⏪ Replay Tests | 🔘 None Found |
| 🔎 Concolic Coverage Tests | 🔘 None Found |
| 📊 Tests Coverage |
🌀 Generated Regression Tests Details
from __future__ import annotations
from collections.abc import Callable
from unittest.mock import MagicMock
# imports
import pytest # used for our unit tests
from langchain_core.tools import ToolException
from langflow.base.tools.component_tool import _build_output_function
from langflow.custom.custom_component.component import Component
from langflow.events.event_manager import EventManager
from langflow.schema.data import JSON
from langflow.schema.message import Message
from pydantic import BaseModel
# codeflash_output is used to check that the output of the original code is the same as that of the optimized code.
from __future__ import annotations
from collections.abc import Callable
from unittest.mock import MagicMock, patch
# imports
import pytest # used for our unit tests
from langchain_core.tools import ToolException
from langflow.base.tools.component_tool import _build_output_function
from langflow.custom.custom_component.component import Component
from langflow.events.event_manager import EventManager
from langflow.schema.data import JSON
from langflow.schema.message import Message
from pydantic import BaseModel
# unit tests
class MockComponent(Component):
def __init__(self, _id):
self._id = _id
def set(self, *args, **kwargs):
pass
class MockMessage(Message):
def get_text(self):
return "mock text"
class MockJSON(JSON):
def __init__(self, data):
self.data = data
class MockBaseModel(BaseModel):
def model_dump(self):
return {"key": "value"}
@pytest.fixture
def mock_component():
return MockComponent(_id="123")
@pytest.fixture
def mock_event_manager():
event_manager = MagicMock(spec=EventManager)
return event_manager
def test_basic_functionality_string(mock_component):
def output_method():
return "output string"
codeflash_output = _build_output_function(mock_component, output_method); output_function = codeflash_output
def test_basic_functionality_json(mock_component):
def output_method():
return MockJSON(data={"key": "value"})
codeflash_output = _build_output_function(mock_component, output_method); output_function = codeflash_output
def test_basic_functionality_basemodel(mock_component):
def output_method():
return MockBaseModel()
codeflash_output = _build_output_function(mock_component, output_method); output_function = codeflash_output
def test_basic_functionality_message(mock_component):
def output_method():
return MockMessage()
codeflash_output = _build_output_function(mock_component, output_method); output_function = codeflash_output
def test_output_type_handling_integer(mock_component):
def output_method():
return 42
codeflash_output = _build_output_function(mock_component, output_method); output_function = codeflash_output
def test_output_type_handling_list(mock_component):
def output_method():
return [1, 2, 3]
codeflash_output = _build_output_function(mock_component, output_method); output_function = codeflash_output
def test_output_type_handling_dict(mock_component):
def output_method():
return {"key": "value"}
codeflash_output = _build_output_function(mock_component, output_method); output_function = codeflash_output
def test_empty_inputs(mock_component):
def output_method():
return "output string"
codeflash_output = _build_output_function(mock_component, output_method); output_function = codeflash_output
def test_large_inputs(mock_component):
def output_method():
return "output string"
large_args = [i for i in range(1000)]
codeflash_output = _build_output_function(mock_component, output_method); output_function = codeflash_output
def test_complex_nested_structures_json(mock_component):
def output_method():
return MockJSON(data={"nested": {"key": "value"}})
codeflash_output = _build_output_function(mock_component, output_method); output_function = codeflash_output
def test_large_scale_performance(mock_component):
def output_method():
return [i for i in range(1000)]
codeflash_output = _build_output_function(mock_component, output_method); output_function = codeflash_output
def test_deterministic_behavior(mock_component):
def output_method():
return "consistent output"
codeflash_output = _build_output_function(mock_component, output_method); output_function = codeflash_output
def test_integration_with_decorator(mock_component):
def output_method():
return "output string"
codeflash_output = _build_output_function(mock_component, output_method); output_function = codeflash_output
To edit these changes git checkout codeflash/optimize-pr6981-2025-04-24T18.34.43 and push.