亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目次
従來(lái)のディレクトリ スキャン方法のパフォーマンスのボトルネック
os.scandir: 効率的なディレクトリ反復(fù)子
最適化された実裝: os.scandir を使用してサブフォルダーを検索します
注意すべき點(diǎn)とベストプラクティス
要約する
ホームページ バックエンド開(kāi)発 Python チュートリアル Python で指定されたサブフォルダーを効率的に検索するための戦略: os.scandir の適用と最適化

Python で指定されたサブフォルダーを効率的に検索するための戦略: os.scandir の適用と最適化

Oct 12, 2025 am 09:48 AM

Python で指定されたサブフォルダーを効率的に検索するための戦略: os.scandir の適用と最適化

この記事では、Python で大きなディレクトリ內(nèi)の特定のサブフォルダーを効率的に検索する方法について説明します。大量のファイルを処理する際の従來(lái)の os.listdir のパフォーマンスのボトルネックを考慮して、この記事では、os.scandir のイテレータ機(jī)能とキャッシュ メカニズムを使用して I/O 操作とメモリ使用量を大幅に削減し、それによってより高速で最適化されたディレクトリ スキャンを?qū)g現(xiàn)する方法を詳しく紹介します。

従來(lái)のディレクトリ スキャン方法のパフォーマンスのボトルネック

Python では、ディレクトリの內(nèi)容を列挙する一般的な方法は、os.listdir() を使用することです。ただし、このアプローチでは、數(shù)十萬(wàn)以上のファイルとサブフォルダーを含む非常に大きなディレクトリを処理する場(chǎng)合、重大なパフォーマンスの問(wèn)題が発生する可能性があります。主な理由は次のとおりです。

  1. 2 つのシステム コール オーバーヘッド: os.listdir() は、まず、指定されたパスにあるすべてのファイルとフォルダーの名前リストを取得します。次に、各エントリがディレクトリであるかどうかを判斷するには (たとえば、os.path.isdir() を使用)、プログラムはリスト內(nèi)の名前ごとに個(gè)別のシステム コールを?qū)g行してメタデータを取得する必要があります。これは、N 個(gè)のエントリに対して、os.path.isdir() への追加のシステムコールが N 回生成され、その結(jié)果、大量の I/O 操作と時(shí)間が消費(fèi)されることを意味します。
  2. メモリ使用量: os.listdir() は、ディレクトリ內(nèi)のすべてのエントリ名を一度にメモリにロードするため、多數(shù)のエントリを含むディレクトリでは大量のメモリ使用量が発生する可能性があります。
  3. 正規(guī)表現(xiàn)一致: すべてのエントリを取得した後、正規(guī)表現(xiàn)でフィルタリングします。強(qiáng)力ではありますが、大規(guī)模なデータの場(chǎng)合は、一致するたびに計(jì)算負(fù)荷が増加します。

以下は、パフォーマンスの問(wèn)題を引き起こす可能性がある典型的な従來(lái)の実裝例です。

 OSをインポートする
輸入再

def find_subfolders_inefficient(関心のあるディレクトリ、関心のある開(kāi)始文字列):
    # 1. すべてのファイル名とフォルダー名を取得します all_entries = os.listdir(dir_of_interest)

    # 2. すべてのサブフォルダーをフィルターで除外します (各 os.path.isdir() はシステム コールです)
    all_subfolders = [
        all_entries の項(xiàng)目に対する項(xiàng)目 
        if os.path.isdir(os.path.join(対象ディレクトリ, 項(xiàng)目))
    】

    # 3. 正規(guī)表現(xiàn)を使用して regexp_pattern = re.compile(starting_string_of_interest) と一致させる
    all_subfolders_of_interest = list(filter(regexp_pattern.match, all_subfolders))

    興味のあるすべてのサブフォルダーを返す

# 呼び出し例 # subfolders = find_subfolders_inefficient('path/to/large/folder', 'prefix_')

os.scandir: 効率的なディレクトリ反復(fù)子

上記のパフォーマンスのボトルネックを解決するために、Python 3.5 では os.scandir() 関數(shù)が導(dǎo)入されました。 os.scandir() は、より効率的なディレクトリ反復(fù)子を提供します。その主な利點(diǎn)は次のとおりです。

  1. システムコールを減らす: os.scandir() は反復(fù)子を返し、各反復(fù)で os.DirEntry オブジェクトを生成します。この DirEntry オブジェクトは、ファイルの作成時(shí)にファイルの種類と統(tǒng)計(jì) (ディレクトリであるか、ファイルであるかなど) をキャッシュするため、この情報(bào)を取得するために os.path.isdir() または os.path.isfile() を呼び出す必要はありません。これにより、ファイル システムへのクエリの數(shù)が大幅に減少します。
  2. イテレータ パターン: os.scandir() は、すべてのエントリを一度にメモリにロードするのではなく、要求に応じて DirEntry オブジェクトを 1 つずつ生成します。これにより、非常に大きなディレクトリを処理する際にメモリ効率が非常に高くなります。
  3. 屬性への直接アクセス: DirEntry オブジェクトは、情報(bào)を決定および取得するために直接使用できる、名前 (ファイル名/フォルダー名)、パス (フルパス)、is_dir()、is_file() などのメソッドと屬性を提供します。

最適化された実裝: os.scandir を使用してサブフォルダーを検索します

os.scandir() を使用して、指定されたサブフォルダーを検索するロジックを最適化すると、パフォーマンスが大幅に向上します。以下は、os.scandir() に基づいて最適化された実裝です。

 OSをインポートする

def find_subfolders_efficient(関心のあるディレクトリ、関心のある開(kāi)始文字列):
    「」
    os.scandir を使用すると、指定したディレクトリ內(nèi)の特定の文字列で始まるサブフォルダーを効率的に検索できます。

    引數(shù):
        dir_of_interest (str): スキャンするディレクトリ パス。
        starting_string_of_interest (str): サブフォルダー名の一致する開(kāi)始文字列。

    戻り値:
        list: 一致するサブフォルダー名のリスト。
    「」
    対象のすべてのサブフォルダー = []

    試す:
        # os.scandir(dir_of_interest) をエントリとして使用してディレクトリ エントリを反復(fù)処理します。
            エントリーの場(chǎng)合:
                # それがディレクトリであり、名前がプレフィックスと一致するかどうかを確認(rèn)します。 #entry.is_dir() は追加のシステムコールを回避します。 #entry.is_dir() とentry.name.startswith(starting_string_of_interest) の場(chǎng)合、entry.name は名前を直接取得し、パスの結(jié)合を回避します。
                    all_subfolders_of_interest.append(entry.name)
    FileNotFoundError を除く:
        print(f"エラー: ディレクトリ '{dir_of_interest}' が存在しません。")
    許可エラーを除く:
        print(f"エラー: ディレクトリ '{dir_of_interest}' にアクセスする権限がありません。")
    e としての例外を除く:
        print(f"ディレクトリのスキャン中に不明なエラーが発生しました: {e}")

    興味のあるすべてのサブフォルダーを返す

# if __name__ == '__main__' の呼び出し例:
    # テストディレクトリ構(gòu)造を作成します (オプション)
    # os.makedirs('test_large_folder/prefix_sub1',exist_ok=True)
    # os.makedirs('test_large_folder/another_sub',exist_ok=True)
    # os.makedirs('test_large_folder/prefix_sub2',exist_ok=True)
    # open('test_large_folder/file.txt', 'w') を f:
    # f.write("テスト")

    target_dir = 'test_large_folder' # 実際のディレクトリに置き換えます search_prefix = 'prefix_'

    print(f"{target_dir} 內(nèi)の '{search_prefix}' で始まるサブフォルダを検索しています...")
    found_subfolders = find_subfolders_efficient(target_dir, search_prefix)

    サブフォルダーが見(jiàn)つかった場(chǎng)合:
        print("次のサブフォルダーが見(jiàn)つかりました:")
        found_subfolders 內(nèi)のフォルダーの場(chǎng)合:
            print(f"- {フォルダ}")
    それ以外:
        print("一致するサブフォルダーが見(jiàn)つかりません。")

上記のコードでは、os.scandir によって返された DirEntry オブジェクトを直接反復(fù)処理するときに、entry.is_dir() メソッドを使用してそれがディレクトリであるかどうかを判斷し、名前の一致にentry.name.startswith() を使用します。このアプローチでは、ファイル タイプの判定と名前のフィルタリングが 1 つのループに組み合わされ、複數(shù)のリストの作成と追加のシステム コールが回避され、パフォーマンスが大幅に向上します。

注意すべき點(diǎn)とベストプラクティス

  • エラー処理:実際のアプリケーションでは、ファイルやディレクトリが存在しない、権限が不足しているなどの異常事態(tài)を常に考慮し、サンプルコードのtry-excelブロックのように適切なエラー処理を行う必要があります。
  • リソース管理: os.scandir() によって返されるイテレータはファイル システム リソースです。使用後にイテレータが正しく閉じられ、例外が発生した場(chǎng)合でもリソースを解放できるようにするには、with ステートメントを使用することをお?jiǎng)幛幛筏蓼埂?/li>
  • クロスプラットフォームの互換性: os.scandir() はクロスプラットフォームであり、Windows、Linux、macOS 上で正しく動(dòng)作します。
  • pathlib との組み合わせ: より最新の Python ファイル システム操作を行うには、 pathlib モジュールとの組み合わせを検討してください。 pathlib.Path オブジェクトは iterdir() メソッドも提供し、その基礎(chǔ)となる層は通常 os.scandir に基づいて実裝され、よりオブジェクト指向の API を提供します。

要約する

os.scandir() は、Python で大規(guī)模なディレクトリ スキャン タスクを処理する場(chǎng)合に不可欠な最適化ツールです。効率的なディレクトリ イテレータを提供し、ファイル タイプ情報(bào)をキャッシュし、不要なシステム コールを回避することにより、ファイル システム操作のパフォーマンスとメモリ効率が大幅に向上します。 os.listdir と os.path.isdir の組み合わせから os.scandir への移行は、特に特定のファイルまたはディレクトリを迅速に取得する必要があるシナリオの場(chǎng)合、Python ファイル システムの対話を最適化するための重要な手順です。

以上がPython で指定されたサブフォルダーを効率的に検索するための戦略: os.scandir の適用と最適化の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國(guó)語(yǔ) Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見(jiàn)つけた場(chǎng)合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫(huà)像を無(wú)料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫(xiě)真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫(xiě)真から衣服を削除するオンライン AI ツール。

Stock Market GPT

Stock Market GPT

AIを活用した投資調(diào)査により賢明な意思決定を?qū)g現(xiàn)

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無(wú)料のコードエディター

SublimeText3 中國(guó)語(yǔ)版

SublimeText3 中國(guó)語(yǔ)版

中國(guó)語(yǔ)版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開(kāi)発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開(kāi)発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ホットトピック

PEFT LORAアダプターとベースモデルの効率的なマージ戦略 PEFT LORAアダプターとベースモデルの効率的なマージ戦略 Sep 19, 2025 pm 05:12 PM

このチュートリアルは、PEFT LORAアダプターをベースモデルと効率的にマージして、完全に獨(dú)立したモデルを生成する方法を詳しく説明しています。この記事は、トランスフォーマーを直接使用することは間違っていることを指摘しています。Automodelはアダプターをロードし、重みを手動(dòng)でマージし、PEFTライブラリでMerge_and_unloadメソッドを使用する正しいプロセスを提供します。さらに、このチュートリアルでは、単語(yǔ)セグメントターを扱うことの重要性も強(qiáng)調(diào)し、PEFTバージョンの互換性の問(wèn)題とソリューションについて説明しています。

pythonでrequastion.txtファイルからパッケージをインストールする方法 pythonでrequastion.txtファイルからパッケージをインストールする方法 Sep 18, 2025 am 04:24 AM

Pipinstall-rrequirements.txtを?qū)g行して、依存関係パッケージをインストールします。競(jìng)合を回避し、ファイルパスが正しく、PIPが更新されていることを確認(rèn)し、必要に応じて-no-depsや-userなどのオプションを使用して、必要に応じてインストール動(dòng)作を調(diào)整することを確認(rèn)して、最初に仮想環(huán)境を作成およびアクティブ化することをお?jiǎng)幛幛筏蓼埂?/p>

PytestでPythonコードをテストする方法 PytestでPythonコードをテストする方法 Sep 20, 2025 am 12:35 AM

Pythonは、Pythonのシンプルで強(qiáng)力なテストツールです。インストール後、命名ルールに従ってテストファイルが自動(dòng)的に発見(jiàn)されます。アサーションテストのためにtest_から始まる関數(shù)を書(shū)き込み、 @pytest.fixtureを使用して再利用可能なテストデータを作成し、pytest.raisesを使用して例外を確認(rèn)し、指定されたテストと複數(shù)のコマンドラインオプションをサポートし、テスト効率を改善します。

Pythonのコマンドライン引數(shù)を処理する方法 Pythonのコマンドライン引數(shù)を処理する方法 Sep 21, 2025 am 03:49 AM

theargparsemoduleisttherecommendedwayto handlecommand-lineargumentsinpython、robustparsing、typevalidation、helpmessages、およびerrorhandling; ousesys.argvforsimplecasesrequiringminimalsetup。

Pythonの浮動(dòng)小數(shù)點(diǎn)數(shù)の精度の問(wèn)題とその高精度計(jì)算スキーム Pythonの浮動(dòng)小數(shù)點(diǎn)數(shù)の精度の問(wèn)題とその高精度計(jì)算スキーム Sep 19, 2025 pm 05:57 PM

この記事の目的は、PythonとNumpyの浮動(dòng)小數(shù)點(diǎn)數(shù)の計(jì)算精度が不十分であるという一般的な問(wèn)題を調(diào)査し、その根本原因は標(biāo)準(zhǔn)64ビットの浮動(dòng)小數(shù)點(diǎn)數(shù)の表現(xiàn)制限にあることを説明しています。より高い精度を必要とするシナリオを計(jì)算するために、この記事では、MPMATH、Sympy、GMPYなどの高精度數(shù)學(xué)ライブラリの使用方法、機(jī)能、および適用可能なシナリオを?qū)毪筏票容^し、読者が複雑な精度のニーズを解決するための適切なツールを選択できるようにします。

PEFT LORAアダプターと基本モデルを正しくマージする方法 PEFT LORAアダプターと基本モデルを正しくマージする方法 Sep 17, 2025 pm 02:51 PM

この記事では、PEFTライブラリのMERGE_AND_UNLOAD関數(shù)を使用して、LORAアダプターを基本的な大手言語(yǔ)モデルに効率的かつ正確に統(tǒng)合する方法を詳しく説明します。この記事では、アダプターの読み込みとトランスを介してモデルの重みを手動(dòng)で統(tǒng)合することに関する一般的な誤解を修正し、モデルのマージ、単語(yǔ)セグメントター処理、潛在的なバージョン互換性の問(wèn)題を解決するための専門(mén)的なガイダンスを含む完全なコード例を提供します。

Pythonの@ContextManagerデコレーターを使用してコンテキストマネージャーを作成するにはどうすればよいですか? Pythonの@ContextManagerデコレーターを使用してコンテキストマネージャーを作成するにはどうすればよいですか? Sep 20, 2025 am 04:50 AM

@ContextManagerFromContextLibandDefineAgeneratoratoraturationは、sexactlyOnceを使用します

PythonでPDFファイルを使用する方法 PythonでPDFファイルを使用する方法 Sep 20, 2025 am 04:44 AM

PYPDF2、PDFPlumber、およびFPDFは、PDFを処理するPythonのコアライブラリです。 pypdf2を使用して、pdfreaderを介してページを読み取り、extract_text()を呼び出してコンテンツを取得するなど、テキスト抽出、マージ、分割、暗號(hào)化を?qū)g行します。 PDFPlumberは、レイアウトテキストの抽出とテーブル認(rèn)識(shí)を保持するのに適しており、Extract_Tables()をサポートしてテーブルデータを正確にキャプチャします。 FPDF(推奨されるFPDF2)はPDFを生成するために使用され、ドキュメントが構(gòu)築され、add_page()、set_font()、およびcell()を介して出力されます。 PDFSをマージすると、PDFWriterのAppend()メソッドは複數(shù)のファイルを統(tǒng)合できます

See all articles