目次
1. 標準ライブラリまたは非標準ライブラリの合理的な使用
2. ループの使用を減らす
3. コードの繰り返し実行に注意する
4. グローバル変数の使用を減らす
5. 合理的なデータ構造を使用する
ホームページ バックエンド開発 Python チュートリアル Pythonの実行効率を高めるテクニックとは?

Pythonの実行効率を高めるテクニックとは?

May 11, 2023 pm 02:13 PM
python

開始する前に、関数の実行時間をカウントする Python デコレータを開発できます。これは、さまざまな Python テクニックを使用した後、時間の統計に使用されます。

# 导入时间提取的time模块
from time import time

import dis


def compute_time(func_):
    '''
    计算函数的运行时间
    '''

    def func_time(*arg, **kw):
        t1 = time()
        result = func_(*arg, **kw)
        t2 = time()
        print(f"{func_.__name__: >10} : {t2 - t1:.6f} 秒")
        return result

    return func_time
ログイン後にコピー

上記の compute_time 時間計算関数を開発しましたが、それが正常に使用されるかどうかをテストするための hello_world 関数を開発できます。

@compute_time
def hello_world():
    print("hello_world!")


hello_world()

# hello_world!
# hello_world : 0.000000 秒
ログイン後にコピー

hello_world 関数のテストを通じて、時間デコレータ compute_time が関数の実行時間を正常に計算できることが証明されました。

次に、Python の実行速度を向上させ、実行時間の結果を提供する次の 5 つの方法を正式に紹介します。

1. 標準ライブラリまたは非標準ライブラリの合理的な使用

開発プロセス中に Python の標準ライブラリまたは非標準ライブラリを過小評価してはなりません。正直に言うと、同じビジネスコードを書くことがあります。確かに、大手のような完璧なものは存在しません。

たとえば、次のような業務では、Python のリストの値を文字列に変換する必要があるのですが、まず、次のコード ブロックがどのように記述されているかを見てください。

# 初始化一个list列表
list_ = ['a', 'b', 'c'] * 10000


@compute_time
def func_1(list_=None):
    '''
    列表元素转字符串函数
    '''
    str_ = ''
    for s in list_:
        str_ = str_ + s
    return str_


func_1(list_)


# func_1 : 0.001999 秒
ログイン後にコピー

私が作成した従来の方法を使用して上記の func_1 関数の実行を変換するのはより複雑で、0.001999 秒かかります。

@compute_time
def func_2(list_=None):
    '''
    列表元素转字符串
    '''
    return ''.join(list_)


func_2(list_)

# func_2 : 0.000000 秒
ログイン後にコピー

func_1 関数の実行時間と比較すると、func_2 の実行時間はほとんど無視できるほどであり、10 進数 6 桁ではまったく変化が見られません。

2. ループの使用を減らす

実際、通常の開発プロセスから、リスト導出、反復などを使用したシリアル化可能なデータ処理方法の方が for ループよりも便利であることがわかりました。 、 効率的。

以下では、例を使用して問題を説明することもできます。たとえば、リスト内の 2 で割り切れる数値を選択する必要があります。

# 初始化循环次数n
n = 100000


@compute_time
def func_3(n=None):
    list_ = []
    for m in range(n):
        if m % 2 == 0:
            list_.append(m)
    return list_


@compute_time
def func_4(n=None):
    return [m for m in range(n) if m % 2 == 0]


func_3(n)

func_4(n)

# func_3 : 0.004986 秒
# func_4 : 0.003014 秒
ログイン後にコピー

func_3 関数と func_4 関数を比較すると、まず、func_4 のメソッドは func_3 よりもはるかに簡単です。

そして、時間の点では、func_4 はリスト導出を使用して、通常の for ループよりも 1/4 高速に実行されます。

3. コードの繰り返し実行に注意する

コードの繰り返し実行については、通常の開発方法で誰もが経験することができます。つまり、公開コードとして 1 回だけ実行できます。ブロック。

パブリックに使用できるコード ブロックをループに追加できます。これは、コード ブロックの実行効率にのみ影響します。

たとえば、文字列内の特定の要素を検索するには、Python の re モジュールを使用する必要があります。時間の結果を比較する 2 つの方法を次に示します。

# 导入正则表达式匹配模块
import re


@compute_time
def func_5(str_=None):
    for s in str_:
        result = re.search(r'a*[a-z]?c', s)


@compute_time
def func_6(str_=None):
    repx = re.compile(r'a*[a-z]?c')
    for s in str_:
        result = repx.search(s)


func_5('abcdefg1234oks' * 1000)

func_6('abcdefg1234oks' * 1000)

# func_5 : 0.006999 秒
# func_6 : 0.002000 秒
ログイン後にコピー

func_5 と func_6 の業務実装方法を比較すると、re モジュールのコンパイル正規一致オブジェクトを for ループの外層に直接配置することで、実行時間が 3 倍以上短縮されました。 。

これは、検索を使用してループ内で通常のオブジェクトに直接一致させると、ループ内に通常の一致するオブジェクトが継続的に作成され、
for ループの処理負荷が増大し、速度が低下するためです。

4. グローバル変数の使用を減らす

この点を説明するとき、グローバル変数は常に存在し、プログラムの実行中に消えることはないことを理解する必要があります。

グローバル変数が多すぎると、操作中に多くのメモリが占​​有されます。グローバル変数と比較してローカル変数を使用した方が効率的です。

以下では、グローバル変数とローカル変数の実行時間を比較する 2 つの方法の例を使用します。

mes_1 = 'ss1'

mes_2 = 'ss2'

mes_3 = 'ss3'


@compute_time
def func_7():
    result = mes_1 + mes_2 + mes_3
    return result


@compute_time
def func_8():
    me_1 = 'ss1'
    me_2 = 'ss2'
    me_3 = 'ss3'
    result = me_1 + me_2 + me_3
    return result


func_7()

func_8()


# func_7 : 0.000997 秒
# func_8 : 0.000000 秒
ログイン後にコピー

問題を説明するために、上で通常の加算計算を実行しましたが、func_8 関数がローカル変数を使用する方法は確かに高速です。

5. 合理的なデータ構造を使用する

ほとんどの Python 開発プロセスでは、多くの人が便宜上データを処理するためにリストを使用する必要があります。

Python にはリスト、タプル、セット、辞書という 4 つのデータ構造が組み込まれており、適切なビジネス シナリオで適切なデータ構造を使用してデータを処理することにより、計算の実行効率も向上します。

例: 以下ではリスト list とタプル tuple から対応するインデックス位置の値を抽出します。

@compute_time
def func_9():
    data = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
    print(data[3])


@compute_time
def func_10():
    data = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h')
    print(data[3])

func_9()

func_10()

# func_9 : 0.000000 秒
# func_10 : 0.000000 秒
ログイン後にコピー

func_9 関数と func_10 関数を実行すると、両者の時間の差は大きくなく、少なくとも小数点以下 6 桁以内では結果を区別できないことがわかりました。

print('func_9汇编产生的机器码:')
dis.dis(func_9)

print('func_10汇编产生的机器码:')
dis.dis(func_10)
ログイン後にコピー

最後に、func_9 と func_10 のアセンブリ機械コードをそれぞれ確認したところ、明らかにリスト リスト処理の方がより多くの機械コードを生成していることがわかりました。

rree

以上がPythonの実行効率を高めるテクニックとは?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

2時間のPython計画:現実的なアプローチ 2時間のPython計画:現実的なアプローチ Apr 11, 2025 am 12:04 AM

2時間以内にPythonの基本的なプログラミングの概念とスキルを学ぶことができます。 1.変数とデータ型、2。マスターコントロールフロー(条件付きステートメントとループ)、3。機能の定義と使用を理解する4。

Python:主要なアプリケーションの調査 Python:主要なアプリケーションの調査 Apr 10, 2025 am 09:41 AM

Pythonは、Web開発、データサイエンス、機械学習、自動化、スクリプトの分野で広く使用されています。 1)Web開発では、DjangoおよびFlask Frameworksが開発プロセスを簡素化します。 2)データサイエンスと機械学習の分野では、Numpy、Pandas、Scikit-Learn、Tensorflowライブラリが強力なサポートを提供します。 3)自動化とスクリプトの観点から、Pythonは自動テストやシステム管理などのタスクに適しています。

MongoDBデータベースパスワードを表示するNAVICATの方法 MongoDBデータベースパスワードを表示するNAVICATの方法 Apr 08, 2025 pm 09:39 PM

Hash値として保存されているため、Navicatを介してMongoDBパスワードを直接表示することは不可能です。紛失したパスワードを取得する方法:1。パスワードのリセット。 2。構成ファイルを確認します(ハッシュ値が含まれる場合があります)。 3.コードを確認します(パスワードをハードコードできます)。

Amazon AthenaでAWS接着クローラーの使用方法 Amazon AthenaでAWS接着クローラーの使用方法 Apr 09, 2025 pm 03:09 PM

データの専門家として、さまざまなソースから大量のデータを処理する必要があります。これは、データ管理と分析に課題をもたらす可能性があります。幸いなことに、AWS GlueとAmazon Athenaの2つのAWSサービスが役立ちます。

Redisでサーバーを開始する方法 Redisでサーバーを開始する方法 Apr 10, 2025 pm 08:12 PM

Redisサーバーを起動する手順には、以下が含まれます。オペレーティングシステムに従ってRedisをインストールします。 Redis-Server(Linux/Macos)またはRedis-Server.exe(Windows)を介してRedisサービスを開始します。 Redis-Cli ping(Linux/macos)またはRedis-Cli.exePing(Windows)コマンドを使用して、サービスステータスを確認します。 Redis-Cli、Python、node.jsなどのRedisクライアントを使用して、サーバーにアクセスします。

Redisキューの読み方 Redisキューの読み方 Apr 10, 2025 pm 10:12 PM

Redisのキューを読むには、キュー名を取得し、LPOPコマンドを使用して要素を読み、空のキューを処理する必要があります。特定の手順は次のとおりです。キュー名を取得します:「キュー:キュー」などの「キュー:」のプレフィックスで名前を付けます。 LPOPコマンドを使用します。キューのヘッドから要素を排出し、LPOP Queue:My-Queueなどの値を返します。空のキューの処理:キューが空の場合、LPOPはnilを返し、要素を読む前にキューが存在するかどうかを確認できます。

Redisのサーバーバージョンを表示する方法 Redisのサーバーバージョンを表示する方法 Apr 10, 2025 pm 01:27 PM

質問:Redisサーバーバージョンを表示する方法は?コマンドラインツールRedis-Cli-versionを使用して、接続されたサーバーのバージョンを表示します。 Info Serverコマンドを使用して、サーバーの内部バージョンを表示し、情報を解析および返信する必要があります。クラスター環境では、各ノードのバージョンの一貫性を確認し、スクリプトを使用して自動的にチェックできます。スクリプトを使用して、Pythonスクリプトとの接続やバージョン情報の印刷など、表示バージョンを自動化します。

Navicatのパスワードはどれくらい安全ですか? Navicatのパスワードはどれくらい安全ですか? Apr 08, 2025 pm 09:24 PM

NAVICATのパスワードセキュリティは、対称暗号化、パスワード強度、セキュリティ対策の組み合わせに依存しています。特定の測定には、SSL接続の使用(データベースサーバーが証明書をサポートして正しく構成することを条件)、NAVICATの定期的な更新、より安全なメソッド(SSHトンネルなど)を使用し、アクセス権を制限し、最も重要なことは、パスワードを記録しないことです。

See all articles