ホームページ  >  記事  >  バックエンド開発  >  Python 正規表現を使用してコードをメモ化する方法

Python 正規表現を使用してコードをメモ化する方法

WBOY
WBOYオリジナル
2023-06-22 19:43:531452ブラウズ

Python では、正規表現は非常に強力なテキスト処理ツールです。これを使用すると、テキスト内の特定の形式を一致させたり置換したりできるため、テキスト処理がより効率的かつ便利になります。

大規模なコードを記述するとき、メモ化が必要な状況によく遭遇します。記憶とは、関数の実行中に生成された結果をキャッシュして、キャッシュされた結果を後続の呼び出しで直接使用できるようにすることを指します。これにより、計算の繰り返しが回避され、コードの実行効率が向上します。 Python では、デコレータを使用してメモ化関数を実装でき、正規表現はメモ化キャッシュをより適切に管理するのに役立ちます。

この記事では、Python 正規表現を使ってコードを覚える方法を紹介します。まず、デコレータの基本的な使用法を理解する必要があります。

  1. Decorator の基本

Decorator は、関数コードを変更せずに関数に追加機能を追加できる構文構造です。これは通常、装飾された関数をパラメータとして受け取る関数であり、その戻り値は新しい関数です。この新しい関数は、装飾された関数が呼び出されたときにいくつかの追加の操作を自動的に実行します。

以下は、関数の実行時間を計算できる簡単なデコレータの例です。

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print('Function "{}" takes {}s to execute.'.format(func.__name__, end_time - start_time))
        return result
    return wrapper

@timer
def foo():
    time.sleep(1)
    return 'Done'

foo()

上記のコードでは、関数をパラメータとして受け取り、新しい関数ラッパー。ラッパー関数が装飾された関数を実行するとき、最初に関数の実行時間を計算し、次に実行時間を出力し、最後に装飾された関数の実行結果を返します。

デコレータを使用する場合、デコレータ関数の前に @decorator 名の構文を追加するだけです。

  1. メモ化の実装

以下では、デコレータを使用してメモ化機能を実装する方法を紹介します。具体的には、関数の入力パラメーターと出力結果をキャッシュして、後続の呼び出しで再計算せずにキャッシュされた結果を直接使用できるようにしたいと考えています。この機能を実現するために、Python の特別なデータ構造、つまり辞書を使用できます。関数の入力パラメータを辞書のキーとして使用し、関数の出力結果を辞書の値として使用し、それらをグローバル変数に保存します。修飾された関数が呼び出されるたびに、まず対応する出力結果が辞書に存在するかどうかを確認します。存在する場合は、キャッシュされた結果が直接返されます。そうでない場合は、関数の計算が実行され、出力結果が辞書に追加されます。

以下は簡単な memoize デコレータの例です:

import functools

memory = {}

def memoize(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        key = (args, tuple(kwargs.items()))
        if key not in memory:
            memory[key] = func(*args, **kwargs)
        return memory[key]
    return wrapper

@memoize
def add(x, y):
    print('Adding {} and {}...'.format(x, y))
    return x + y

print(add(2, 3))    # Adding 2 and 3... 5
print(add(2, 3))    # 5

上記のコードでは、memoize デコレータが定義されており、その機能はキャッシュのキーと値のペアをグローバル変数メモリに保存することです。後続の呼び出しでキャッシュされた結果が存在するかどうかを確認します。装飾された関数が呼び出されると、入力パラメーターは最初にタプルと辞書に変換され、次にキーと値のペアとして使用されて、キャッシュされた結果があるかどうかが確認されます。存在しない場合は、装飾された関数が呼び出されて結果が計算され、その結果がキャッシュ ディクショナリに追加されます。存在する場合は、キャッシュされた結果が直接返されます。装飾された関数の場合、functools.wraps を使用して docstring と関数名の継承を実装します。

上記のコードは、関数の入力パラメーターとして通常のデータ型を使用するのに適していますが、実際の開発では、リスト、タプル、セットなどのより複雑なデータ型に遭遇する可能性があります。この時点で、キーと値のペアをキャッシュするためのキーとして使用できるように、正規表現を使用してデータ型を文字列に変換する必要があります。

  1. 正規表現の使用

正規表現は、文字列の一致と処理に使用できる式です。 Python では、re モジュールを使用して正規表現を使用できます。以下は簡単な正規表現の例です。

import re

pattern = r'd+'
text = '123abc456def789'
match = re.search(pattern, text)
print(match.group())    # 123

上記のコードでは、d を含む正規表現パターンを定義します。これは、1 つ以上の数値と一致することを意味します。次に、 re.search 関数を使用して文字列テキスト内のパターンと一致し、Match オブジェクトを返します。 Match オブジェクトには、一致した文字列、開始位置と終了位置などの情報が含まれています。一致した文字列は、グループ メソッドを通じて取得できます。

メモ化機能を実装する場合、入力パラメータを文字列に変換し、正規表現を使用してパラメータ内の数字、文字、記号、その他の情報をキーとして抽出し、キーと値のペアをキャッシュすることができます。以下はサンプル コードです。

import re
import functools

memory = {}

def memoize(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        args_str = ', '.join(map(str, args))
        kwargs_str = ', '.join('{}={}'.format(k, v) for k, v in kwargs.items())
        key_str = args_str + ', ' + kwargs_str
        match = re.search(r'd+', key_str)
        key = match.group()
        if key not in memory:
            memory[key] = func(*args, **kwargs)
        return memory[key]
    return wrapper

@memoize
def add(x, y):
    print('Adding {} and {}...'.format(x, y))
    return x + y

print(add(2, 3))    # Adding 2 and 3... 5
print(add(2, 3))    # 5

print(add(2, 4))    # Adding 2 and 4... 6
print(add(2, 4))    # 6

print(add(1, y=2))  # Adding 1 and 2... 3
print(add(1, y=2))  # 3

上記のコードでは、入力パラメータを文字列に変換し、正規表現を使用してそこからキーと値のペアのキーとして数値を抽出します。対応するキーがキャッシュ ディクショナリにすでに存在する場合は結果が直接返され、そうでない場合は関数計算が実行され、結果がキャッシュ ディクショナリに追加されます。

  1. 概要

この記事では、コードを暗記するために Python 正規表現を使用する方法を紹介します。デコレータと正規表現を使用すると、関数の実行結果のキャッシュをより適切に管理し、計算の繰り返しを回避し、コードの実行効率を向上させることができます。実際のアプリケーションでは、記憶技術をより効果的に活用するために、キャッシュの有効期限や容量制御などの問題も考慮する必要があります。

以上がPython 正規表現を使用してコードをメモ化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。