首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

10个简单好用的python装饰器,赶紧收藏学起来!

1、装饰器基础介绍

在Python编程领域,装饰器是一种强大的功能,它允许用户在不修改原有函数定义的情况下,给函数添加额外的功能。这章将带你深入了解装饰器的精髓 ,从基本概念到进阶技巧,让你的代码更加灵活高效。

1.1 什么是装饰器

装饰器本质上是一个接受函数作为参数的函数,它返回一个新的函数,这个新函数通常会在执行原始函数之前或之后执行一些额外的操作。简而言之,装饰器为函数提供了“包裹”功能,扩展了其行为而无需修改源代码。

示例代码:

def simple_decorator(func):

def wrapper():

print("Something is happening before the function is called.")

func()

print("Something is happening after the function is called.")

return wrapper

@simple_decorator

def say_hello():

print("Hello!")

say_hello()

输出结果:

Something is happening before the function is called.

Hello!

Something is happening after the function is called.1.2 装饰器的语法糖 @

Python中的@符号是装饰器的语法糖 ,它使得应用装饰器变得简洁直观。上面的@simple_decorator就相当于say_hello = simple_decorator(say_hello),但更加易读且减少了代码量。

1.3 不改变原函数名的装饰器

在使用装饰器时 ,原始函数的名称可能被覆盖,为了保留原函数的元信息(如名称、文档字符串等) ,可以利用functools.wraps装饰器来增强自定义装饰器。

改进的装饰器示例:

from functools import wraps

def better_decorator(func):

@wraps(func)

def wrapper(*args, **kwargs):

print("Wrapper is doing something before calling the function.")

result = func(*args, **kwargs)

print("Wrapper is doing something after calling the function.")

return result

return wrapper

@better_decorator

def greet(name):

"""Prints a greeting."""

print(f"Hello, {name}!")

print(greet.__name__)

print(greet.__doc__)

greet("Alice")

输出结果:

greet

Prints a greeting.

Wrapper is doing something before calling the function.

Hello, Alice!

Wrapper is doing something after calling the function.

这样,即使经过装饰,greet函数的名称和文档字符串也得以保留,提高了代码的可读性和维护性。

2、计时装饰器 ⏱️

计时装饰器是一种实用工具,用于衡量函数执行时间,对于性能调优和监控至关重要。本章将探讨如何实现计时装饰器,并如何保持函数的元信息及处理函数执行过程中的异常。

2.1 简单计时装饰器实现

最基础的计时装饰器通过time模块来测量函数的运行时间。下面是一个简单的例子:

import time

def timing_decorator(func):

def wrapper(*args, **kwargs):

start_time = time.time()

result = func(*args, **kwargs)

end_time = time.time()

print(f"{func.__name__} ran in: {end_time - start_time} secs")

return result

return wrapper

@timing_decorator

def example_function(n):

sum = 0

for i in range(n):

sum += i

return sum

example_function(1000000)

输出示例:

example_function ran in: 0.12345 secs2.2 使用functools.wraps保持元信息

直接应用上述装饰器会丢失被装饰函数的一些重要属性,比如函数名、文档字符串等。为了解决这个问题,可以使用functools.wraps来保留这些元数据:

from functools import wraps

import time

def timing_decorator_with_wraps(func):

@wraps(func)

def wrapper(*args, **kwargs):

start_time = time.time()

result = func(*args, **kwargs)

end_time = time.time()

print(f"{func.__name__} ran in: {end_time - start_time} secs")

return result

return wrapper

@timing_decorator_with_wraps

def enhanced_example_function(n):

"""Computes the sum of first n numbers."""

return sum(range(n))

print(enhanced_example_function.__doc__)

enhanced_example_function(1000000)

输出示例:

Computes the sum of first n numbers.

enhanced_example_function ran in: 0.12345 secs2.3 异常处理与装饰器结合

在实际应用中,被装饰的函数可能会抛出异常。为了更好地管理这些情况,可以在装饰器中加入异常处理逻辑:

def timing_decorator_with_exception_handling(func):

@wraps(func)

def wrapper(*args, **kwargs):

try:

start_time = time.time()

result = func(*args, **kwargs)

end_time = time.time()

print(f"{func.__name__} ran in: {end_time - start_time} secs")

return result

except Exception as e:

print(f"An error occurred in {func.__name__}: {e}")

raise

return wrapper

@timing_decorator_with_exception_handling

def function_might_raise_error(n):

if n < 0:

raise ValueError("n must be non-negative")

return sum(range(n))

try:

function_might_raise_error(-1)

except ValueError:

pass  # Handled exception outside

输出示例:

An error occurred in function_might_raise_error: n must be non-negative

通过上述方式 ,计时装饰器不仅能够准确测量函数执行时间,还能够优雅地处理可能出现的异常情况 ,增强了代码的健壮性。

3、日志记录装饰器

日志记录是软件开发中不可或缺的一环,它帮助开发者追踪程序运行状态、诊断问题。本章将展示如何利用装饰器来增强函数的日志功能,包括基础日志记录、动态调整日志级别以及参数化日志内容。

3.1 基础日志装饰器

使用Python标准库logging模块,我们可以创建一个基础的日志装饰器来自动记录函数的调用信息。

import logging

def logging_decorator(logger=logging.getLogger(__name__)):

def decorator(func):

@wraps(func)

def wrapper(*args, **kwargs):

logger.info(f"Calling function '{func.__name__}' with args={args}, kwargs={kwargs}")

result = func(*args, **kwargs)

logger.info(f"Function '{func.__name__}' finished execution.")

return result

return wrapper

return decorator

@logging_decorator()

def sample_function(x, y):

return x + y

sample_function(3, 4)

此装饰器会在调用函数前后记录日志信息 ,包含函数名、传入参数和执行状态。

3.2 动态日志级别调整

在某些场景下,可能需要根据运行环境或特定条件动态调整日志级别。我们可以通过传递日志级别参数来实现这一需求。

def logging_decorator_with_level(level=logging.INFO):

def decorator(func):

log = logging.getLogger(func.__name__)

log.setLevel(level)

@wraps(func)

def wrapper(*args, **kwargs):

log.info(f"Executing '{func.__name__}' with args={args}, kwargs={kwargs}")

result = func(*args, **kwargs)

log.info(f"'{func.__name__}' execution complete.")

return result

return wrapper

return decorator

@logging_decorator_with_level(logging.DEBUG)

def dynamic_log_function(a, b):

return a * b

dynamic_log_function(5, 10)

这里,装饰器接受日志级别作为参数,允许在装饰时灵活设置。

3.3 参数化日志内容

为了让日志更加灵活和丰富,我们可以设计装饰器以接受额外参数来自定义日志消息的内容。

def custom_log_message_decorator(message_prefix=""):

def decorator(func):

@wraps(func)

def wrapper(*args, **kwargs):

log = logging.getLogger(func.__name__)

log.info(f"{message_prefix} Calling '{func.__name__}' with args={args}, kwargs={kwargs}")

result = func(*args, **kwargs)

log.info(f"{message_prefix} '{func.__name__}' finished execution.")

return result

return wrapper

return decorator

@custom_log_message_decorator("DEBUG MODE: ")

def custom_message_function(value):

return value ** 2

custom_message_function(9)

通过在装饰器中引入message_prefix参数 ,日志消息前可以附加上特定的前缀 ,使得日志信息更具有上下文关联性。

以上示例展示了如何利用装饰器有效地增强函数的日志记录能力 ,无论是基础日志输出、动态级别调整还是参数化内容定制 ,都能让日志成为理解程序运行流程和调试问题的强大工具。

4、缓存装饰器

缓存装饰器通过存储函数的返回值来提高重复调用时的效率,尤其适用于计算密集型或IO操作频繁的场景。本章将深入探讨几种实现缓存逻辑的方式。

4.1 使用functools.lru_cache

Python标准库中的functools.lru_cache是最简便的缓存装饰器实现方式 ,它实现了最近最少使用(Least Recently Used)缓存策略。

from functools import lru_cache

@lru_cache(maxsize=128)

def fibonacci(n):

if n < 2:

return n

return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(10))  # 首次计算并缓存结果

print(fibonacci(10))  # 直接从缓存中获取结果

这里,maxsize参数指定了缓存的容量,当超过限制时,最近最少使用的项会被移除。

4.2 自定义缓存逻辑

有时,标准库提供的缓存策略可能不满足特定需求 ,这时可以自定义缓存逻辑。

class CustomCache:

def __init__(self):

self.cache = {}

def __call__(self, func):

def wrapper(*args, **kwargs):

key = (args, frozenset(kwargs.items()))

if key not in self.cache:

self.cache[key] = func(*args, **kwargs)

return self.cache[key]

return wrapper

@CustomCache()

def expensive_function(x):

print("Calculating...")

return x ** 2

print(expensive_function(5))  # 计算并缓存

print(expensive_function(5))  # 从缓存中返回结果

自定义缓存类提供了灵活性,可根据具体需求调整缓存策略,例如添加过期时间、容量限制等。

4.3 考虑时效性的缓存策略

对于那些结果随时间变化的函数 ,引入时效性至缓存策略是必要的。

from datetime import datetime, timedelta

from functools import wraps

def cache_with_ttl(ttl=timedelta(seconds=5)):

def decorator(func):

cache = {}

@wraps(func)

def wrapper(*args, **kwargs):

now = datetime.now()

key = (args, frozenset(kwargs.items()))

if key not in cache or now - cache[key][1] > ttl:

cache[key] = (func(*args, **kwargs), now)

return cache[key][0]

return wrapper

return decorator

@cache_with_ttl(timedelta(seconds=2))

def time_sensitive_data():

print("Fetching data...")

return datetime.now()

print(time_sensitive_data())  # 首次获取数据

time.sleep(3)

print(time_sensitive_data())  # 仍在缓存期内,返回旧数据

time.sleep(3)

print(time_sensitive_data())  # 缓存已过期,重新获取数据

通过为缓存结果附加时间戳,我们可以实施一个带有时间限制的缓存策略 ,确保数据的新鲜度。

综上所述 ,无论是使用内置的lru_cache,自定义缓存逻辑,还是引入时效性策略 ,缓存装饰器都是提升程序效率的有效手段,尤其在处理昂贵运算时。正确应用缓存策略,可以让程序在保持响应速度的同时减少不必要的资源消耗。

5、权限校验装饰器

权限校验是确保应用程序安全的关键环节,装饰器在此处扮演着简化权限控制逻辑的角色。本章将探讨三种不同的权限验证策略,增强你的应用安全性。

5.1 基于角色的访问控制

基于角色的访问控制(Role-Based Access Control, RBAC)是常见的权限管理模型 ,通过定义角色并分配权限给角色 ,进而给用户分配角色来控制访问。

def role_required(role):

def decorator(func):

def wrapper(user, *args, **kwargs):

if user['role'] != role:

raise PermissionError("User does not have the required role.")

return func(user, *args, **kwargs)

return wrapper

return decorator

@role_required('admin')

def admin_only(user):

return f"Welcome, {user['name']}! You have admin privileges."

user = {'name': 'Alice', 'role': 'admin'}

print(admin_only(user))  # 正确执行

user = {'name': 'Bob', 'role': 'user'}

# print(admin_only(user))  # 将引发PermissionError

通过role_required装饰器,只有具备指定角色的用户才能执行被装饰的函数。

5.2 令牌验证装饰器

在API或Web应用中,令牌验证是常用的认证方式。下面的示例展示如何创建一个简单的JWT(JSON Web Token)验证装饰器。

import jwt

def jwt_required(token_secret):

def decorator(func):

def wrapper(token, *args, **kwargs):

try:

payload = jwt.decode(token, token_secret, algorithms=['HS256'])

except jwt.ExpiredSignatureError:

raise AuthenticationError("Token has expired.")

except jwt.InvalidTokenError:

raise AuthenticationError("Invalid token.")

return func(payload.get('user'), *args, **kwargs)

return wrapper

return decorator

@jwt_required('my_secret_key')

def protected_endpoint(token):

return f"Hello, {token['username']}! This is a protected endpoint."

# 注意:此处省略了实际生成和使用JWT的过程,仅演示装饰器的使用逻辑。

此装饰器确保请求携带有效的JWT ,并解码后传递用户信息给被装饰函数。

5.3 多重权限校验

在复杂场景中,可能需要同时校验多个权限条件。下面是一个多重权限检查的装饰器示例。

def multi_permission_check(checks):

def decorator(func):

def wrapper(*args, **kwargs):

for check in checks:

if not check(*args, **kwargs):

raise PermissionError("Permission check failed.")

return func(*args, **kwargs)

return wrapper

return decorator

def is_admin(user):

return user.get('role') == 'admin'

def is_owner(resource_id, user_id):

# 假设这是检查用户是否为资源所有者的逻辑

return True

@multi_permission_check([is_admin, lambda u: is_owner(u['resource_id'], u['id'])])

def delete_resource(user, resource_id):

return f"Resource {resource_id} deleted by {user['name']}."

# 测试用例

user = {'name': 'AdminUser', 'role': 'admin', 'id': 1, 'resource_id': 1}

print(delete_resource(user, 1))  # 成功执行

通过组合不同的权限检查函数,multi_permission_check装饰器确保所有条件都满足后才执行被装饰的函数,增加了权限控制的灵活性和安全性。

6、重试装饰器

在不稳定或网络依赖的环境中,重试机制是处理临时故障的有效策略。本章将逐步构建重试装饰器 ,从基础到高级,确保操作的成功执行。

6.1 简单重试机制

首先,实现一个基本的重试逻辑,当函数执行失败时自动重试固定次数。

def retry_on_failure(retries=3):

def decorator(func):

def wrapper(*args, **kwargs):

attempt = 0

while attempt <= retries:

try:

return func(*args, **kwargs)

except Exception:

attempt += 1

if attempt > retries:

raise

return wrapper

return decorator

@retry_on_failure()

def might_fail_randomly():

import random

if random.randint(0, 9) > 5:  # 模拟随机失败

raise Exception("Temporary failure.")

return "Success!"

print(might_fail_randomly())

此装饰器在函数失败时尝试重新执行,直到达到设定的重试次数。

6.2 配置重试次数与间隔

为了更精细的控制,我们可以让装饰器支持自定义重试次数和每次重试间的延迟。

import time

def retry_with_delay(retries=3, delay=1):

def decorator(func):

def wrapper(*args, **kwargs):

attempt = 0

while attempt <= retries:

try:

return func(*args, **kwargs)

except Exception:

attempt += 1

if attempt <= retries:

time.sleep(delay)

else:

raise

return wrapper

return decorator

@retry_with_delay(retries=5, delay=2)

def simulate_network_issue():

import random

if random.randint(0, 9) > 7:  # 模拟网络不稳定

raise IOError("Network issue.")

return "Data fetched."

print(simulate_network_issue())

现在,每次重试之间会有固定的延迟 ,有助于缓解瞬时资源压力。

6.3 智能重试(根据异常类型)

在某些情况下,只应对特定类型的异常进行重试是有意义的。我们可以通过判断捕获的异常类型来实现智能重试。

def retry_on_specific_errors(retries=3, delay=1, error_types=(Exception,)):

def decorator(func):

def wrapper(*args, **kwargs):

attempt = 0

while attempt <= retries:

try:

return func(*args, **kwargs)

except tuple(error_types) as e:

attempt += 1

if attempt <= retries:

time.sleep(delay)

print(f"Retrying due to {e.__class__.__name__}.")

else:

raise

return wrapper

return decorator

@retry_on_specific_errors(retries=3, error_types=(ConnectionError,))

def fetch_remote_data(url):

# 这里假设了fetch_data函数会抛出ConnectionError

raise ConnectionError("Failed to connect.")

try:

fetch_remote_data("http://example.com/data")

except Exception as e:

print(f"Failed after retries: {e}")

通过指定重试应针对的异常类型列表 ,装饰器变得更加智能,仅对预期的暂时性错误进行重试。

这些重试装饰器的实现展示了如何在Python中灵活地处理函数调用失败,通过自动化重试机制提升系统的稳定性和健壮性。

7、单例装饰器

单例模式确保一个类只有一个实例,并提供全局访问点。在Python中 ,装饰器是实现这一设计模式的优雅方式。本章将探索单例装饰器的三种不同实现途径。

7.1 实现Singleton模式

最基本的形式是通过装饰器来确保类的实例化仅发生一次。

def singleton(cls):

_instance = {}

def get_instance(*args, **kwargs):

if cls not in _instance:

_instance[cls] = cls(*args, **kwargs)

return _instance[cls]

return get_instance

@singleton

class MySingleton:

def __init__(self, value=None):

self.value = value or "default"

s1 = MySingleton("instance one")

s2 = MySingleton("instance two")

print(s1.value)  # 输出: instance one

print(s2.value)  # 输出: instance one ,证明s1和s2是同一个实例7.2 类装饰器实现单例

类装饰器提供了一种面向对象的方式来实现单例模式,可以封装更多的逻辑。

class SingletonMeta(type):

_instances = {}

def __call__(cls, *args, **kwargs):

if cls not in cls._instances:

cls._instances[cls] = super().__call__(*args, **kwargs)

return cls._instances[cls]

class SingletonClass(metaclass=SingletonMeta):

def __init__(self, value=None):

self.value = value or "singleton class instance"

obj1 = SingletonClass("first init")

obj2 = SingletonClass("second init")

print(obj1.value)  # 输出: first init

print(obj2.value)  # 同样输出: first init7.3 线程安全的单例模式

在多线程环境下,上述实现可能面临竞态条件。使用threading.Lock确保线程安全。

import threading

def thread_safe_singleton(cls):

_instance = {}

_lock = threading.Lock()

def get_instance(*args, **kwargs):

with _lock:

if cls not in _instance:

_instance[cls] = cls(*args, **kwargs)

return _instance[cls]

return get_instance

@thread_safe_singleton

class ThreadSafeSingleton:

def __init__(self, value=None):

self.value = value or "thread safe singleton"

# 在多线程环境中测试ThreadSafeSingleton

# (此处省略多线程测试代码 ,但在实际应用中需确保测试环境支持并发验证)

通过这些方法 ,我们不仅实现了单例模式的基本逻辑,还考虑到了线程安全,确保了在并发环境下的正确性。这些实现展示了装饰器在设计模式应用中的强大与灵活性。

8、类方法装饰器

类方法装饰器为面向对象编程增添了新的维度,允许对类方法的行为进行统一修改和增强 ,而不直接修改类本身。本章深入探究类方法装饰器的原理及其应用。

8.1 装饰类方法原理

类方法装饰器本质上是一个接收类方法作为参数的函数 ,它返回一个替代的或增强后的函数。关键在于理解装饰器如何作用于classmethod和staticmethod,以及普通实例方法。

def log_method_call(method):

def wrapper(self, *args, **kwargs):

print(f"Calling {method.__name__} with args={args}, kwargs={kwargs}")

return method(self, *args, **kwargs)

return wrapper

class MyClass:

@log_method_call

def instance_method(self, message):

print(f"Instance method says: {message}")

@classmethod

@log_method_call

def class_method(cls, msg):

print(f"Class method says: {msg}")

my_obj = MyClass()

my_obj.instance_method("Hello")

MyClass.class_method("Goodbye")

这里,log_method_call装饰器在每个方法调用前后打印日志 ,展示了其工作原理。

8.2 类装饰器与实例方法

应用于实例方法的装饰器,像上例中的instance_method,会在每次实例方法调用时执行装饰器内的逻辑。装饰器可以访问实例的属性(通过self),并且能够影响或监视方法的执行过程。

8.3 类装饰器的高级应用

类装饰器的高级应用包括但不限于自动验证、性能监控、事务管理、日志记录等。例如,通过动态添加事务管理可以确保方法的原子性:

from contextlib import contextmanager

@contextmanager

def transaction():

print("Starting transaction")

try:

yield

except Exception:

print("Rollback")

raise

else:

print("Commit")

def transaction_decorator(method):

@wraps(method)

def wrapper(self, *args, **kwargs):

with transaction():

return method(self, *args, **kwargs)

return wrapper

class BankAccount:

@transaction_decorator

def withdraw(self, amount):

if self.balance >= amount:

self.balance -= amount

print(f"Withdrew {amount}. New balance: {self.balance}")

else:

raise ValueError("Insufficient funds")

account = BankAccount()

account.balance = 100

account.withdraw(50)

通过transaction_decorator,withdraw方法被自动置于事务上下文中 ,增加了代码的健壮性和可维护性。类方法装饰器因此成为了增强代码功能、提高代码质量和开发效率的强大工具。

9、参数验证装饰器

参数验证是确保函数或方法接收到预期数据类型和格式的关键步骤,有助于提升代码健壮性和用户体验。本章将介绍三种参数验证策略,从基础到高级,确保输入数据的准确性。

9.1 基础参数检查

最直接的方法是在函数内部进行基本的类型检查,手动验证参数是否符合预期。

def validate_age(age):

if not isinstance(age, int) or age < 0:

raise ValueError("Age must be a positive integer.")

print(f"Valid age: {age}")

validate_age(25)  # 正确

# validate_age("25")  # 将引发ValueError

此方法简单直接,但随着参数增多,代码会变得冗余。

9.2 使用第三方库pydantic

pydantic是一个强大的库,提供数据验证和解析功能,支持复杂的数据结构定义,自动转换和错误处理。

from pydantic import BaseModel

class User(BaseModel):

name: str

age: int = Field(..., ge=0)

def welcome_user(user_data):

user = User.parse_obj(user_data)

print(f"Welcome, {user.name}!")

welcome_user({"name": "Alice", "age": 30})  # 正确处理

# welcome_user({"name": "Bob", "age": -1})  # 将引发ValidationError

pydantic通过声明式定义数据模型 ,自动完成复杂的验证逻辑 ,提升了代码的可读性和维护性。

9.3 自动文档生成结合参数验证

结合pydantic和自动文档生成工具如Sphinx,可以自动生成包含参数验证规则的API文档,方便团队协作和外部使用者理解。

from pydantic import BaseModel, Field

from typing import Optional

class CreateUserRequest(BaseModel):

username: str = Field(..., min_length=4, description="Username must be at least 4 characters long.")

email: str = Field(..., regex=r".+@\w+\.\w+", description="Valid email format required.")

bio: Optional[str] = Field(None, max_length=256, description="Optional short bio, max 256 characters.")

# Sphinx或其他文档生成工具可以读取这些描述和规则自动生成文档

此法不仅验证了输入数据,还直接将验证规则转化为文档 ,提升了文档的准确性和一致性,减少了文档维护成本。

通过这些策略,参数验证装饰器或模型定义不仅强化了输入处理逻辑,还促进了代码的清晰度和文档的自动生成,是现代API和函数式编程不可或缺的一部分。

10、性能剖析装饰器

性能剖析是优化代码、识别瓶颈的重要步骤,装饰器为此提供了一种便捷途径。本章聚焦于如何运用Python标准库cProfile进行性能监控 ,并结合可视化工具进行深入分析。

10.1 使用cProfile的装饰器

利用cProfile模块,可以轻松创建一个性能剖析装饰器,记录函数执行的详细时间花费。

import cProfile

def profile_decorator(func):

def wrapper(*args, **kwargs):

profiler = Profile.Profile()

profiler.enable()

result = func(*args, **kwargs)

profiler.disable()

profiler.print_stats()

return result

return wrapper

@profile_decorator

def example_function(n):

sum = 0

for i in range(n):

sum += i

return sum

example_function(100000000)

这段代码中,example_function执行时,会自动开启性能剖析 ,并在结束时打印函数内部各部分的耗时统计。

10.2 热函数快速定位

性能剖析的目的是快速识别代码中的热区(hotspot),即耗时最多的地方。结合装饰器使用,可直接定位到具体函数或代码段。

from functools import wraps

import cProfile

def line_by_line_profile(func):

@wraps(func)

def wrapper(*args, **kwargs):

profiler = cProfile()

profiler.runctx('func(*args, **kwargs)', globals(), locals())

profiler.print_stats(sort='cumulative')

return wrapper

return wrapper

@line_by_line_profile

def heavy_computation(x):

result = []

for i in range(x):

result.append(i**2)

return result

heavy_computation(10000000)

通过cProfile.runctx,我们按行级统计执行时间 ,sort='cumulative'确保按累积时间排序 ,便于找到耗时最多的行。

10.3 结合可视化工具分析

尽管cProfile自带打印统计信息 ,但结合图形界面或Web工具如SnakeViz、PyCharm能让分析更直观。

from snakeviz import Profiler, SnakeViz

def visualize_profiling(func):

@wraps(func)

def wrapper(*args, **kwargs):

profiler = Profiler()

profiler.start()

result = func(*args, **kwargs)

profiler.stop()

profiler.export_chrome_cprofile()

SnakeViz(profiler.results).render()

return wrapper

@visualize_profiling

def complex_calculation(numbers):

return [num*2 for num in numbers if num % 2 == 0]

complex_calculation(range(1000000))

这里,SnakeViz将性能数据导出为Chrome浏览器可查看的文件,便于交互式探索函数调用时分布,直观识别瓶颈所在。

通过这些步骤,性能剖析装饰器不仅提供了快速、无侵入式的性能监测方式 ,还借助可视化工具深化了理解,有效指导性能优化决策。

11、总结与展望

探索Python装饰器的奇妙世界,本指南详细介绍了从基础到高级的装饰器应用,包括计时、日志记录、缓存、权限校验、重试机制、单例模式、类方法装饰以及参数验证和性能剖析。通过实际代码示例,展示了如何利用装饰器增强代码功能、提升程序性能和安全性,是Python开发者提升编程技艺的必备读物。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OuQlEfXKqJO4eGaMz-D-LtHg0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券