mirror of
https://git.datalinker.icu/vllm-project/vllm.git
synced 2025-12-16 08:56:02 +08:00
57 lines
1.4 KiB
Python
57 lines
1.4 KiB
Python
# SPDX-License-Identifier: Apache-2.0
|
|
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
|
|
|
|
from __future__ import annotations
|
|
|
|
import contextlib
|
|
from collections.abc import Callable
|
|
from functools import wraps
|
|
from typing import Any
|
|
|
|
|
|
@contextlib.contextmanager
|
|
def cprofile_context(save_file: str | None = None):
|
|
"""Run a cprofile
|
|
|
|
Args:
|
|
save_file: path to save the profile result. "1" or
|
|
None will result in printing to stdout.
|
|
"""
|
|
import cProfile
|
|
|
|
prof = cProfile.Profile()
|
|
prof.enable()
|
|
|
|
try:
|
|
yield
|
|
finally:
|
|
prof.disable()
|
|
if save_file and save_file != "1":
|
|
prof.dump_stats(save_file)
|
|
else:
|
|
prof.print_stats(sort="cumtime")
|
|
|
|
|
|
def cprofile(save_file: str | None = None, enabled: bool = True):
|
|
"""Decorator to profile a Python method using cProfile.
|
|
|
|
Args:
|
|
save_file: Path to save the profile result.
|
|
If "1", None, or "", results will be printed to stdout.
|
|
enabled: Set to false to turn this into a no-op
|
|
"""
|
|
|
|
def decorator(func: Callable):
|
|
@wraps(func)
|
|
def wrapper(*args: Any, **kwargs: Any):
|
|
if not enabled:
|
|
# If profiling is disabled, just call the function directly.
|
|
return func(*args, **kwargs)
|
|
|
|
with cprofile_context(save_file):
|
|
return func(*args, **kwargs)
|
|
|
|
return wrapper
|
|
|
|
return decorator
|