ホームページ > バックエンド開発 > Python チュートリアル > あなたが知っておくべきPythonパフォーマンスのヒント

あなたが知っておくべきPythonパフォーマンスのヒント

Mary-Kate Olsen
リリース: 2025-01-30 02:22:10
オリジナル
972 人が閲覧しました

Pythonコードのパフォーマンス最適化完全戦略

Pythonダイナミックタイプの解釈言語として、走行速度はCなどの静的タイプのコンピレーション言語よりも遅くなる可能性があります。しかし、特定の手法と戦略により、Pythonコードのパフォーマンスを大幅に改善できます。この記事では、Pythonコードを最適化してより速く効率的に実行し、Pythonのモジュールを使用して時間を実行するためにコードを正確に測定する方法について説明します。 timeit

注:

デフォルトでは、モジュールはコードを100万回繰り返し、測定結果の精度と安定性を確保します。 の例コード(timeit測定を使用

関数実行時間を使用):

timeit print_hi Pythonスクリプトの実行時間計算方法

<code class="language-python">import timeit

def print_hi(name):
    print(f'Hi, {name}')

if __name__ == '__main__':
    t = timeit.Timer(setup='from __main__ import print_hi', stmt='print_hi("leapcell")')
    print(t.timeit())</code>
ログイン後にコピー

は、モジュール内の高精度タイマーを提供します。これは、短時間の間隔を測定するのに適しています。たとえば、

I.

I/O -DENSE操作とは、I/O操作の完了にほとんどの手順を費やしたプログラムまたはタスクを指します。 I/O操作には、ディスクからのデータ、ディスク、ネットワーク通信などの読み取りが含まれます。これらの操作には通常、ハードウェア機器が含まれるため、その実行速度はハードウェアの性能とI/O帯域幅に限定されます。 time time.perf_counter()特性は次のとおりです

<code class="language-python">import time

start_time = time.perf_counter()

# ...你的代码逻辑...

end_time = time.perf_counter()
run_time = end_time - start_time
print(f"程序运行时间: {run_time} 秒")</code>
ログイン後にコピー
ログイン後にコピー
待ち時間:

プログラムがI/O操作を実行する場合、データが外部デバイスからメモリまたはメモリから外部デバイスへの送信にデータを送信するためのデータを待機する必要があります。ブロッキング。

CPU使用率:

I/O操作の待ち時間により、CPUはこの期間中に自由状態にある可能性があり、CPU使用率が低くなります。

パフォーマンスボトルネック:

i/o操作速度は、特にデータボリュームが大きいか、伝送速度が遅い場合、プログラムパフォーマンスのボトルネックになることがよくあります。

    たとえば、
  1. 100万のI/O集約型操作を実行
  2. 実行結果は約3秒です。また、の空の方法を呼び出すと、プログラムの速度が大幅に改善されます。
  3. > i/o濃度操作最適化方法:
  4. 必要に応じて(ファイルの読み取りや書き込みなど)、次の方法を使用して効率を向上させることができます。
非同期i/o:

を使用してprintおよびその他の非同期プログラミングモデルを使用して、I/O操作が完了するのを待っている間にプログラムが他のタスクを実行し続け、CPU使用率を高めることができます。

<code class="language-python">import time
import timeit

def print_hi(name):
    print(f'Hi, {name}')
    return

if __name__ == '__main__':
    start_time = time.perf_counter()
    t = timeit.Timer(setup='from __main__ import print_hi', stmt='print_hi("leapcell")')
    t.timeit()
    end_time = time.perf_counter()
    run_time = end_time - start_time
    print(f"程序运行时间: {run_time} 秒")</code>
ログイン後にコピー
ログイン後にコピー
Cushion: print並列処理:print_hi('xxxx')データ全体の速度処理速度を改善するために、並行して複数のI/O操作を実行します。
<code class="language-python">def print_hi(name):
    return</code>
ログイン後にコピー
ログイン後にコピー
最適化されたデータ構造:

適切なデータ構造を選択して、データの読み取り時間と書き込み時間を減らします。

2。ジェネレーターを使用してリストと辞書を生成

Python 2.7およびその後のバージョンでは、リスト、辞書、およびコレクタージェネレーターが改善され、データ構造の構築プロセスが簡潔で効率的になりました。
  1. <code class="language-python">import timeit def print_hi(name): print(f'Hi, {name}') if __name__ == '__main__': t = timeit.Timer(setup='from __main__ import print_hi', stmt='print_hi("leapcell")') print(t.timeit())</code>

    2。ジェネレーターの最適化を使用してください:

    <code class="language-python">import time
    
    start_time = time.perf_counter()
    
    # ...你的代码逻辑...
    
    end_time = time.perf_counter()
    run_time = end_time - start_time
    print(f"程序运行时间: {run_time} 秒")</code>
    ログイン後にコピー
    ログイン後にコピー
    ジェネレーターを使用する方法は、よりシンプルで高速です。

    3つ、文字列の縫いを避け、

    join()を使用します メソッドは、特に多数の文字列を扱う場合は、

    オペレーターよりも高速な文字列を扱う場合、またはメモリをより速くフォーマットしてメモリを保存する場合に、文字列を効率的に接続します。

    join()たとえば: %

    を使用します

    4。サイクルの代わりに
    <code class="language-python">import time
    import timeit
    
    def print_hi(name):
        print(f'Hi, {name}')
        return
    
    if __name__ == '__main__':
        start_time = time.perf_counter()
        t = timeit.Timer(setup='from __main__ import print_hi', stmt='print_hi("leapcell")')
        t.timeit()
        end_time = time.perf_counter()
        run_time = end_time - start_time
        print(f"程序运行时间: {run_time} 秒")</code>
    ログイン後にコピー
    ログイン後にコピー
    を使用してください

    join()

    関数は、通常、従来の
    <code class="language-python">def print_hi(name):
        return</code>
    ログイン後にコピー
    ログイン後にコピー
    サイクルよりも効率的です。

    従来のサイクル方法:map()

    map()関数を使用:for

    5。適切なデータ構造を選択適切なデータ構造を選択することは、Pythonコードの実行効率を改善するために不可欠です。辞書の検索効率はリストよりも高く(特に大量のデータ量で)、小さなデータの量が逆の場合。 頻繁に多くの要素を削除した場合は、

    の使用を検討してください。 頻繁に検索するときは、
    <code class="language-python">def fun1():
        list_ = []
        for i in range(100):
            list_.append(i)</code>
    ログイン後にコピー
    2つのポイント検索の使用を検討してください。

    6。不必要な関数呼び出しを避けてくださいmap()

    不要な関数呼び出しを削減し、複数の操作をマージし、効率を向上させます。
    <code class="language-python">def fun1():
        list_ = [i for i in range(100)]</code>
    ログイン後にコピー

    7つ、不必要な紹介を避けてください

    不要なモジュールのインポートを削減し、費用を削減します。

    collections.deque 8。グローバル変数の使用を避けてくださいbisect

    関数内にコードを配置します。これは通常、速度を上げる可能性があります。 9つ、モジュールと関数属性アクセスを避けます

    を使用して、属性アクセスの費用を回避します。

    10個、内なるサイクルの計算を減らします

    ループで事前に計算できる値を計算して、重複計算を削減します。

    (Pythonコードのパフォーマンスの最適化とは何の関係もないため、Leapcellプラットフォームの紹介が省略されています)

    上記の最適化方法は常に適用できるとは限らず、特定の状況に従って適切な最適化戦略を選択する必要があることに注意してください。 パフォーマンスとテストコードは、最も効果的な最適化ソリューションを見つけることができます。

以上があなたが知っておくべきPythonパフォーマンスのヒントの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート