最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python @mylog.timer 裝飾器的使用

 更新時(shí)間:2026年03月22日 10:08:26   作者:Yorlen_Zhang  
本文詳細(xì)介紹了Python計(jì)時(shí)裝飾器@mylog.timer的實(shí)現(xiàn)與應(yīng)用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

@mylog.timer 裝飾器的詳細(xì)教學(xué)。這通常是指用于測量函數(shù)執(zhí)行時(shí)間并記錄日志的裝飾器

1. 基礎(chǔ)版本:簡易計(jì)時(shí)裝飾器

import time
import functools

def timer(func):
    """基礎(chǔ)計(jì)時(shí)裝飾器"""
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.perf_counter()
        result = func(*args, **kwargs)
        end_time = time.perf_counter()
        print(f"[TIMER] {func.__name__} 執(zhí)行時(shí)間: {end_time - start_time:.4f} 秒")
        return result
    return wrapper

# 使用方式
@timer
def slow_function():
    time.sleep(1)
    return "完成"

slow_function()
# 輸出: [TIMER] slow_function 執(zhí)行時(shí)間: 1.0023 秒

2. 進(jìn)階版本:集成日志系統(tǒng)(推薦)

實(shí)際項(xiàng)目中,我們通常需要專業(yè)的日志管理:

import logging
import time
import functools
from typing import Callable, Any
# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S'
)
class MyLog:
    """日志工具類,包含計(jì)時(shí)裝飾器"""
    def __init__(self, name: str = "MyLog"):
        self.logger = logging.getLogger(name)
    def timer(self, level: int = logging.INFO):
        """
        帶日志級(jí)別的計(jì)時(shí)裝飾器
        用法:
        @mylog.timer()
        @mylog.timer(logging.DEBUG)
        """
        def decorator(func: Callable) -> Callable:
            @functools.wraps(func)
            def wrapper(*args, **kwargs) -> Any:
                # 記錄開始時(shí)間
                start_time = time.perf_counter()
                try:
                    # 執(zhí)行函數(shù)
                    result = func(*args, **kwargs)
                    # 計(jì)算耗時(shí)
                    end_time = time.perf_counter()
                    duration = end_time - start_time
                    # 獲取函數(shù)參數(shù)信息
                    args_repr = [repr(a) for a in args]
                    kwargs_repr = [f"{k}={v!r}" for k, v in kwargs.items()]
                    signature = ", ".join(args_repr + kwargs_repr)
                    # 記錄日志
                    self.logger.log(
                        level,
                        f"[TIMER] {func.__name__}({signature}) -> {duration:.4f}s"
                    )
                    return result
                except Exception as e:
                    # 異常時(shí)也記錄耗時(shí)
                    end_time = time.perf_counter()
                    duration = end_time - start_time
                    self.logger.error(
                        f"[TIMER] {func.__name__} 執(zhí)行失敗,耗時(shí): {duration:.4f}s, 錯(cuò)誤: {e}"
                    )
                    raise
            return wrapper
        return decorator
# 實(shí)例化
mylog = MyLog()
# 使用示例
@mylog.timer()
def calculate_sum(n: int):
    """計(jì)算 1 到 n 的和"""
    return sum(range(1, n + 1))
@mylog.timer(logging.DEBUG)
def fetch_data(url: str):
    """模擬獲取數(shù)據(jù)"""
    time.sleep(0.5)
    return f"Data from {url}"
# 測試
calculate_sum(1000000)
fetch_data("https://api.example.com")

3. 高級(jí)版本:帶配置和統(tǒng)計(jì)功能

import logging
import time
import functools
import statistics
from typing import Dict, List
from collections import defaultdict

class AdvancedMyLog:
    """高級(jí)日志類,支持統(tǒng)計(jì)多次調(diào)用的性能數(shù)據(jù)"""
    
    _stats: Dict[str, List[float]] = defaultdict(list)
    
    def __init__(self, name: str = "AdvancedLog"):
        self.logger = logging.getLogger(name)
        handler = logging.StreamHandler()
        formatter = logging.Formatter(
            '%(asctime)s | %(name)s | %(levelname)s | %(message)s'
        )
        handler.setFormatter(formatter)
        self.logger.addHandler(handler)
        self.logger.setLevel(logging.DEBUG)
    
    def timer(self, log_args: bool = True, alert_threshold: float = None):
        """
        高級(jí)計(jì)時(shí)裝飾器
        
        Args:
            log_args: 是否記錄函數(shù)參數(shù)
            alert_threshold: 超時(shí)警告閾值(秒)
        """
        def decorator(func):
            @functools.wraps(func)
            def wrapper(*args, **kwargs):
                func_name = func.__qualname__
                start = time.perf_counter()
                
                result = func(*args, **kwargs)
                
                duration = time.perf_counter() - start
                
                # 保存統(tǒng)計(jì)數(shù)據(jù)
                self._stats[func_name].append(duration)
                
                # 構(gòu)建日志消息
                if log_args and (args or kwargs):
                    args_str = ", ".join(
                        [repr(a) for a in args[1:]] +  # 排除 self/cls
                        [f"{k}={v!r}" for k, v in kwargs.items()]
                    )
                    msg = f"[TIMER] {func_name}({args_str}) 耗時(shí): {duration:.4f}s"
                else:
                    msg = f"[TIMER] {func_name} 耗時(shí): {duration:.4f}s"
                
                # 檢查閾值
                if alert_threshold and duration > alert_threshold:
                    self.logger.warning(f"[SLOW] {msg} (超過閾值 {alert_threshold}s)")
                else:
                    self.logger.info(msg)
                
                return result
            return wrapper
        return decorator
    
    @classmethod
    def get_stats(cls, func_name: str = None):
        """獲取性能統(tǒng)計(jì)報(bào)告"""
        if func_name:
            times = cls._stats.get(func_name, [])
            if not times:
                return f"{func_name}: 無數(shù)據(jù)"
            return {
                "函數(shù)": func_name,
                "調(diào)用次數(shù)": len(times),
                "平均耗時(shí)": statistics.mean(times),
                "最大耗時(shí)": max(times),
                "最小耗時(shí)": min(times),
            }
        
        return {name: cls.get_stats(name) for name in cls._stats}

# 使用示例
adv_log = AdvancedMyLog()

class DataProcessor:
    @adv_log.timer(alert_threshold=1.0)  # 超過1秒警告
    def process(self, data: list):
        time.sleep(0.8)  # 模擬處理
        return len(data)

processor = DataProcessor()
processor.process([1, 2, 3])
processor.process([4, 5, 6])

# 查看統(tǒng)計(jì)
print(AdvancedMyLog.get_stats("DataProcessor.process"))

4. 異步函數(shù)支持

現(xiàn)代 Python 常使用 async/await,需要特殊處理:

import asyncio
import time
import functools

class AsyncTimerLog:
    def __init__(self):
        self.logger = logging.getLogger("AsyncLog")
    
    def timer(self, func):
        """支持異步函數(shù)的計(jì)時(shí)裝飾器"""
        @functools.wraps(func)
        async def async_wrapper(*args, **kwargs):
            start = time.perf_counter()
            result = await func(*args, **kwargs)
            duration = time.perf_counter() - start
            self.logger.info(f"[ASYNC TIMER] {func.__name__} 耗時(shí): {duration:.4f}s")
            return result
        
        @functools.wraps(func)
        def sync_wrapper(*args, **kwargs):
            start = time.perf_counter()
            result = func(*args, **kwargs)
            duration = time.perf_counter() - start
            self.logger.info(f"[SYNC TIMER] {func.__name__} 耗時(shí): {duration:.4f}s")
            return result
        
        # 自動(dòng)判斷是否是協(xié)程函數(shù)
        if asyncio.iscoroutinefunction(func):
            return async_wrapper
        return sync_wrapper

# 使用
mylog = AsyncTimerLog()

@mylog.timer
async def async_fetch():
    await asyncio.sleep(1)
    return "data"

@mylog.timer
def sync_fetch():
    time.sleep(0.5)
    return "data"

# 運(yùn)行
sync_fetch()
asyncio.run(async_fetch())

5. 使用場景與最佳實(shí)踐

5.1 性能監(jiān)控

# 監(jiān)控 API 接口響應(yīng)時(shí)間
@mylog.timer(alert_threshold=2.0)
def api_endpoint():
    # 數(shù)據(jù)庫查詢等操作
    pass

5.2 算法優(yōu)化對(duì)比

@mylog.timer()
def algorithm_v1(data):
    # 舊算法
    pass

@mylog.timer()
def algorithm_v2(data):
    # 新算法
    pass

# 對(duì)比兩者的執(zhí)行時(shí)間

5.3 上下文管理器(替代方案)

import time
from contextlib import contextmanager

@contextmanager
def timer_context(name: str):
    start = time.perf_counter()
    yield
    duration = time.perf_counter() - start
    print(f"[BLOCK TIMER] {name}: {duration:.4f}s")

# 使用
with timer_context("代碼塊 A"):
    time.sleep(1)

6. 注意事項(xiàng)

注意點(diǎn)說明
functools.wraps必須保留原函數(shù)的元數(shù)據(jù)(__name____doc__
異常處理確保即使函數(shù)拋出異常也能記錄耗時(shí)
性能開銷日志本身有開銷,生產(chǎn)環(huán)境建議設(shè)置開關(guān)
線程安全多線程環(huán)境下統(tǒng)計(jì)數(shù)據(jù)需要加鎖

完整使用模板

# config.py 或 utils.py
import logging
import time
import functools

class MyLog:
    _instance = None
    
    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super().__new__(cls)
        return cls._instance
    
    def __init__(self, name="MyApp"):
        if not hasattr(self, 'logger'):
            self.logger = logging.getLogger(name)
            self.logger.setLevel(logging.INFO)
            if not self.logger.handlers:
                handler = logging.StreamHandler()
                handler.setFormatter(
                    logging.Formatter('%(asctime)s - %(message)s')
                )
                self.logger.addHandler(handler)
    
    def timer(self, level=logging.INFO):
        def decorator(func):
            @functools.wraps(func)
            def wrapper(*args, **kwargs):
                start = time.perf_counter()
                try:
                    result = func(*args, **kwargs)
                    duration = time.perf_counter() - start
                    self.logger.log(
                        level, 
                        f"[?? TIMER] {func.__name__} completed in {duration:.4f}s"
                    )
                    return result
                except Exception as e:
                    duration = time.perf_counter() - start
                    self.logger.error(
                        f"[?? TIMER] {func.__name__} failed after {duration:.4f}s: {e}"
                    )
                    raise
            return wrapper
        return decorator

# 全局實(shí)例
mylog = MyLog()

# 業(yè)務(wù)代碼中使用
@mylog.timer()
def your_function():
    pass

到此這篇關(guān)于python @mylog.timer 裝飾器的使用的文章就介紹到這了,更多相關(guān)python @mylog.timer 裝飾器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • pycharm修改主題顏色和注釋顏色的詳細(xì)圖文教程

    pycharm修改主題顏色和注釋顏色的詳細(xì)圖文教程

    PyCharm是一款強(qiáng)大的Python編輯器,相信很多人都已經(jīng)用上了它,這篇文章主要給大家介紹了關(guān)于pycharm修改主題顏色和注釋顏色的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-04-04
  • 使用turtle繪制五角星、分形樹

    使用turtle繪制五角星、分形樹

    這篇文章主要為大家詳細(xì)介紹了使用turtle繪制五角星、分形樹,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 一些常用的Python爬蟲技巧匯總

    一些常用的Python爬蟲技巧匯總

    這篇文章主要為大家詳細(xì)匯總了一些常用的Python爬蟲技巧,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • 基于Python實(shí)現(xiàn)的單詞統(tǒng)計(jì)與查找分析工具

    基于Python實(shí)現(xiàn)的單詞統(tǒng)計(jì)與查找分析工具

    本文介紹了單詞統(tǒng)計(jì)與查找分析工具的設(shè)計(jì)與實(shí)現(xiàn),該工具支持三種查找策略,可計(jì)算文本中的單詞總數(shù)、唯一單詞數(shù)和平均查找長度(ASL),工具采用Python開發(fā),包含核心算法層和GUI交互層,需要的朋友可以參考下
    2026-01-01
  • Python使用Apache Kafka時(shí)Poll拉取速度慢的解決方法

    Python使用Apache Kafka時(shí)Poll拉取速度慢的解決方法

    在使用Apache Kafka時(shí),poll方法拉取消息速度慢常見于網(wǎng)絡(luò)延遲、消息大小過大、消費(fèi)者配置不當(dāng)或高負(fù)載情況,本文提供了優(yōu)化消費(fèi)者配置、并行消費(fèi)、優(yōu)化消息處理邏輯和監(jiān)控調(diào)試的解決方案,并附有Python代碼示例和相關(guān)類圖、序列圖以幫助理解和實(shí)現(xiàn)
    2024-09-09
  • Window10上Tensorflow的安裝(CPU和GPU版本)

    Window10上Tensorflow的安裝(CPU和GPU版本)

    這篇文章主要介紹了Window10上Tensorflow的安裝(CPU和GPU版本),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • python中json.dumps()和json.loads()的用法

    python中json.dumps()和json.loads()的用法

    json.dumps()和json.loads()?json.dumps()用于將字典形式轉(zhuǎn)換為字符串,下面這篇文章主要給大家介紹了關(guān)于python中json.dumps()和json.loads()用法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • Python利用Redis計(jì)算經(jīng)緯度距離案例

    Python利用Redis計(jì)算經(jīng)緯度距離案例

    這篇文章主要介紹了Python利用Redis計(jì)算經(jīng)緯度距離案例,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-09-09
  • Python while true實(shí)現(xiàn)爬蟲定時(shí)任務(wù)

    Python while true實(shí)現(xiàn)爬蟲定時(shí)任務(wù)

    這篇文章主要介紹了Python爬蟲定時(shí)任務(wù)簡單實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Python中注釋使用方法舉例詳解

    Python中注釋使用方法舉例詳解

    在Python編程語言中注釋是必不可少的一部分,它有助于提高代碼的可讀性和維護(hù)性,這篇文章主要介紹了Python中注釋使用方法的相關(guān)資料,需要的朋友可以參考下
    2025-06-06

最新評(píng)論

锡林浩特市| 洛浦县| 苏尼特右旗| 育儿| 江安县| 会昌县| 巨鹿县| 同心县| 龙游县| 惠水县| 历史| 安图县| 澄城县| 合肥市| 屏东市| 崇义县| 沂源县| 鄱阳县| 桦川县| 宁波市| 印江| 四子王旗| 买车| 河西区| 张掖市| 视频| 潜江市| 博罗县| 柘荣县| 读书| 谢通门县| 托克逊县| 桐城市| 炉霍县| 福安市| 毕节市| 南开区| 潍坊市| 平定县| 农安县| 台东市|