有用的 Python 提示和技巧 — #3

摘要:函数缓存是一种技术,它允许您存储昂贵或频繁调用的函数调用的结果,并在再次出现相同的输入时返回缓存的结果。这可以显著提高使用相同参数重复调用的函数的性能,从而减少不必要的计算。

函数缓存是一种技术,它允许您存储昂贵或频繁调用的函数调用的结果,并在再次出现相同的输入时返回缓存的结果。这可以显著提高使用相同参数重复调用的函数的性能,从而减少不必要的计算。

Python 的标准库为通过 functools.LRU_cache 进行缓存提供了一个方便的工具。此装饰器将结果存储在最近最少使用 (LRU) 缓存中,这意味着它将保留最新的结果,并在缓存达到其限制时丢弃最早的结果。

import timefrom functools import lru_cache@lru_cache(maxsize=12) # Cache up to 12 unique resultsdef fibonacci(n): if n

在上面的示例中,第一次使用特定参数(例如 12)调用斐波那契时,将计算结果并将其存储在缓存中。任何具有相同参数的后续调用都将立即返回缓存的结果。

lru_cache 中的 maxsize 参数控制在缓存开始丢弃最早的结果之前存储多少个不同的结果。

这是一种很好的技术,可以在不改变函数的核心逻辑的情况下优化代码性能!

在构建 Python 应用程序时,管理配置设置(如 API 密钥、环境变量或数据库连接)很快就会变得复杂。Pydantic 的 Settings 模块通过自动加载和验证环境变量、.env 文件或默认值的设置,提供了一种干净有效的方法来处理配置。

BaseSettings 类有助于将配置构建为强类型、易于访问的模型。它确保您的设置经过充分验证且类型安全,从而避免在处理配置时出现常见错误。

pip install -q pydantic-settingsimport os# Define the environment variables. # You can also place them in a .env file or by using the export command to # set them directly.os.environ['DATABASE_URI'] = "file:memdb1?mode=memory&cache=shared"os.environ['DEBUG_MODE'] = "True" from pydantic_settings import BaseSettingsclass Settings(BaseSettings): database_uri: str debug_mode: bool = False class Config: env_file = ".env" # Load settings from an optional .env file# Instantiate and use the settingssettings = Settingsprint(settings.database_uri)print(settings.debug_mode)

Pydantic 的设置模块是管理和验证配置的出色工具,可确保您的应用程序保持健壮且易于维护。无论您是构建小型脚本还是大型应用程序,此模块都有助于简化配置处理。

描述符是 Python 中一个强大但鲜为人知的功能,它允许自定义属性访问。描述符可用于验证、缓存或延迟加载。描述符是实现一个或多个方法 __get__、__set__ 和 __delete__ 的对象,这些方法管理属性访问的行为。描述符可用于定义属性、管理访问控制和对类属性实施约束。

下面是一个 Descriptors 示例,其中 __get__ 和 __set__ 都已实现。

class InchToCmDescriptor: def __set__(self, instance, value): if not isinstance(value, (int, float)): raise ValueError("Height must be a number.") instance._inches = value / 2.54 def __get__(self, instance, owner): if instance is None: return self return instance._inches * 2.54 def __delete__(self, instance): del instance._inchesclass Height: height_cm = InchToCmDescriptor def __init__(self, inches) -> None: self._inches = inchesheight = Height(70)print(height.height_cm) # Output: 177.8height.height_cm = 180print(height._inches) # Output: 70.86614173228346

此示例 aboce 演示了一个描述符,该描述符可自动在英寸和厘米之间转换高度测量值。

Python 中的描述符提供了一种强大的方法来管理属性访问和强制执行特定行为或约束。在此示例中,InchToCmDescriptor 无缝处理英寸和厘米之间的转换,从而增强了 Height 类的功能,而不会使其接口复杂化。了解描述符可以帮助您在 Python 中编写更灵活、更可维护的面向对象的代码。

Pickling 是将 Python 对象序列化为字节流的过程,以便可以将其保存到文件中或通过网络传输。Unpickling 是相反的过程,其中字节流被转换回 Python 对象。Python 的 pickle 模块促进了这些过程。

import pickle# Define a class with properties and methodsclass Person: def __init__(self, name, age): self.name = name self.age = age def to_upper(self): return self.name.upper# Class instance data = Person("John", 36)# Open a file in binary write modewith open("data.pkl", "wb") as file: # Serialize the class instance and write it to the file pickle.dump(data, file)print("Data has been pickled.")

在这里,字典数据被转换为二进制格式并另存为 data.pkl。pickle.dump 函数处理序列化过程。

import pickle# Open the file in binary read modewith open("data.pkl", "rb") as file: # Deserialize the data loaded_data = pickle.load(file)print("Unpickled Data:", loaded_data)# Read properties and call methods from unpickled class instanceprint(loaded_data.name)print(loaded_data.age)print(loaded_data.to_upper)

在此示例中,存储在 data.pkl 中的二进制数据使用 pickle.load 反序列化回 Python 字典。二进制数据是具有属性和方法的类实例。

安全性:从不受信任的来源解封数据时要小心,因为它可能会执行任意代码。效率:Pickling 对于简单的数据类型是有效的,但与 JSON 等其他序列化格式相比,它可能更慢且可移植性更差。

当您想要保存对象的 state 并在以后重新加载它而不会丢失任何信息时,Pickling 特别有用。

反转魔术功能

在 Python 中,__invert__ 是一种特殊方法,也称为按位 NOT 魔术方法。它用于为支持它的对象实现按位 NOT 运算符 (~)。当您将 ~ 运算符应用于对象时,Python 会自动调用 __invert__ 方法,并将对象本身作为参数传递。该方法应返回一个新对象,该对象表示原始对象的按位反转。

class InverseStr: def __init__(self, value: str): self.value = value def __str__(self) -> str: return self.value def __invert__(self) -> 'InverseStr': return InverseStr(self.value[::-1])s = InverseStr('hello world')print(s) # hello worldprint(~s) # dlrow olleh

在此示例中,__invert__ 方法在使用 ~ 运算符时反转字符串。这演示了如何为本身不支持按位 NOT 运算的对象自定义该方法,从而为处理此类操作提供灵活性。

来源:自由坦荡的湖泊AI一点号

相关推荐