Pythonの稼働効率を向上させる6つのコツ

5248 ワード

Pythonは優れた言語で、短時間でわずかなコードで多くの操作を行うことができます.それだけでなく、マルチプロセスなどのマルチタスク処理も簡単にサポートされます.
Pythonが苦手な人は、Pythonの運転が遅すぎると愚痴をこぼすことが多い.しかし、事実はそうではない.以下の6つのコツを試して、あなたのPythonアプリケーションをスピードアップします.
コツ1:キーコード外部機能パッケージの使用
Pythonは多くのプログラミングタスクを簡略化したが、いくつかの時間に敏感なタスクについては、その表現がよく気に入らない.C/C++またはマシン言語の外部機能パッケージを使用して、時間的に敏感なタスクを処理することで、アプリケーションの実行効率を効果的に向上させることができます.これらの機能パッケージは、特定のプラットフォームに依存することが多いので、自分が使用しているプラットフォームに基づいて適切な機能パッケージを選択します.簡単に言えば、このコツは、アプリケーションの移植性を犠牲にして、最下位ホストの直接プログラミングでしか得られない実行効率を取り替える必要があります.以下に、効率を向上させるために選択できる機能パッケージを示します.
  • Cython
  • Pylnlne
  • PyPy
  • Pyrex

  • これらの機能パッケージの用途はそれぞれ異なります.たとえば、C言語のデータ型を使用すると、メモリ操作に関するタスクをより効率的または直感的に行うことができます.PyrexはPythonがこのような機能を拡張するのに役立ちます.PylnlineはPythonアプリケーションで直接Cコードを使用することができます.インラインコードは独立してコンパイルされていますが、すべてのコンパイルファイルをどこかに保存し、C言語で提供される効率を十分に利用できます.
    コツ2:ソート時にキーを使う
    Pythonには、カスタマイズされたソート・メソッドを作成するのに多くの時間を費やし、これらのソート・メソッドの実行時にプログラムの実際の実行速度を遅らせる古いソート・ルールがたくさんあります.最適なソート方法は、キーと内蔵sort()メソッドをできるだけ多く使用することです.たとえば、次のコードを使用します.
    import operator
    somelist = [(1, 5, 8), (6, 2, 4), (9, 7, 5)]
    somelist.sort(key=operator.itemgetter(0))
    somelist
    #Output = [(1, 5, 8), (6, 2, 4), (9, 7, 5)]
    somelist.sort(key=operator.itemgetter(1))
    somelist
    #Output = [(6, 2, 4), (1, 5, 8), (9, 7, 5)]
    somelist.sort(key=operator.itemgetter(2))
    somelist
    #Output = [(6, 2, 4), (9, 7, 5), (1, 5, 8)],
    

    各例ではlistは、キーパラメータとして選択したインデックスに基づいてソートされます.この方法は数値タイプだけでなく,文字列タイプにも同様に適用できる.
    コツ3:サイクルの最適化
    各プログラミング言語は最適化されたループスキームを強調する.Pythonを使用すると、豊富なテクニックでループプログラムをより速く走ることができます.しかし、開発者たちがよく忘れているテクニックの一つは、変数の属性にループでアクセスすることをできるだけ避けることです.たとえば、次のコードを使用します.
    lowerlist = ['this', 'is', 'lowercase']
    upper = str.upper
    upperlist = []
    append = upperlist.append
    for word in lowerlist:
        append(upper(word))
        print(upperlist)
        #Output = ['THIS', 'IS', 'LOWERCASE']
    

    str.upperを呼び出すたびに、Pythonはこの式の値を計算します.しかし、この評価を変数に割り当てると、評価の結果が事前にわかり、Pythonプログラムがより速く動作することができます.そのため、Pythonのサイクル中の作業量をできるだけ減らすことが肝心です.Pythonは実行の特性を説明するため,上記の例ではその速度を大幅に遅くする.
    (注意:ループを最適化する方法はまだたくさんありますが、これはその1つにすぎません.たとえば、多くのプログラマーは、リスト・導出式がループ速度を向上させる最善の方法だと考えています.重要なのは、ループ・スキームを最適化することがアプリケーションの実行速度を向上させる上で好ましい選択であることです.)
    コツ4:新しいPythonバージョンを使う
    インターネットでPythonを検索すると、Pythonのバージョンをアップグレードする方法について数え切れない情報が表示されます.通常、各バージョンのPythonには、以前のバージョンよりも実行速度が優れるように最適化されたコンテンツが含まれています.ただし、制限要因は、お気に入りの関数ライブラリが新しいPythonバージョンをサポートする同期更新があるかどうかです.関数ライブラリが更新されるべきかどうかを議論するよりも、新しいPythonバージョンがこの更新をサポートするのに十分であるかどうかが重要です.
    自分のコードが新しいバージョンでも実行できることを保証してください.新しいPythonバージョンを体験するには、新しい関数ライブラリを使用する必要があります.そして、重要な変更をしたときに自分のアプリケーションをチェックする必要があります.必要な修正を完了してから、新しいバージョンの違いを体得することができます.
    しかし、自分のアプリケーションが新しいバージョンで実行できることを確認するだけでは、新しいバージョンが提供する新しい特性を逃す可能性があります.更新を決定したら、新しいバージョンでのアプリケーションのパフォーマンスを分析し、問題が発生する可能性がある部分を確認し、これらの部分に対して新しいバージョンの特性を優先的に適用します.このようにしてこそ、ユーザは更新の初めからアプリケーションの性能の変化に気づくことができる.
    コツ5:複数の符号化方法を試みる
    アプリケーションを作成するたびに、同じ符号化方法を使用する例外はほとんどなく、アプリケーションの実行効率が低下します.プログラム分析時にいくつかの試験的な方法を試してみることができます.たとえば、辞書のデータ項目を処理するときに、安全な方法を使って、データ項目がすでに存在していることを確認してから更新するか、直接データ項目を更新して、存在しないデータ項目を特例として別々に処理することができます.次の最初のコードを見てください.
    n = 16
    myDict = {}
    for i in range(0, n):
        char = 'abcd'[i%4]
        if char not in myDict:
            myDict[char] = 0
            myDict[char] += 1
            print(myDict)
    

    最初myDictが空の場合、このコードは速く走ります.しかし、通常、myDictはデータを満たし、少なくとも大部分のデータを記入する場合、別の方法を置き換えるとより効率的になります.
    n = 16
    myDict = {}
    for i in range(0, n):
        char = 'abcd'[i%4]
        try:
            myDict[char] += 1
        except KeyError:
            myDict[char] = 1
        print(myDict)
    

    両方の方法で出力結果は同じです.違いは、出力がどのように得られるかです.従来の思考パターンから飛び出し、新しいプログラミングテクニックを作成することで、アプリケーションをより効率的にすることができます.
    コツ6:あなたのアプリケーションをクロスコンパイルする
    開発者は、コンピュータが現代のアプリケーションを作成するためのプログラミング言語を理解していないことを忘れることがあります.コンピュータは機械言語を理解している.あなたのアプリケーションを実行するために、あなたが作成した人間が読むことができるコードをアプリケーションを借りて機械が読むことができるコードに変換します.時々、Pythonのような言語でアプリケーションを作成し、C++のような言語でアプリケーションを実行することができます.これは実行の観点から言えば、実行できます.重要なのは、アプリケーションが何をしたいのか、ホストシステムがどのようなリソースを提供できるのかということです.NuitkaPythonコードをC++コードに変換できる面白いクロスコンパイラです.これにより、解釈プログラムに依存することなくnativeモードで独自のアプリケーションを実行できます.自分のアプリケーションの実行効率が大幅に向上していることがわかりますが、これはプラットフォームとタスクの違いによって異なります.
    (注意:Nuitkaまだテスト段階なので、実際のアプリケーションでは注意してください.実際には、今は実験に使用したほうがいいです.また、クロスコンパイルが実行効率を高めるための最善の方法であるかどうかについて議論する余地があります.開発者はクロスコンパイルを長年使用しており、アプリケーションの速度を向上させることができます.覚えておいてください.それぞれの解決策いずれもメリットとデメリットがありますので、生産環境に使用する前によく考えてください.)
    クロスコンパイラを使用する場合は、Pythonバージョンがサポートされていることを確認してください.NuitkaはPython 2.6,2.7,3.2,3.3をサポートしています.ソリューションを有効にするには、Python解釈器とC++コンパイラが必要です.Nuitkaは、Microsoft Visual StudioMinGWおよびClang/LLVMを含む多くのC++コンパイラをサポートしています.
    クロスコンパイルは、いくつかの深刻な問題を引き起こす可能性があります.たとえば、Nuitkaを使用すると、小さなプログラムでも大きな駆動スペースが消費されることがわかります.Nuitkaは一連のダイナミックリンクライブラリ(DDLs)を利用してPythonの機能を実行するためである.したがって、リソースが限られたシステムを使用している場合は、この方法はあまり実行できないかもしれません.
    結論
    前述した6つのコツは、より効率的なPythonアプリケーションを作成するのに役立ちます.しかし銀弾は存在しない.上記のコツは必ずしも毎回効くとは限らない.特定のPythonのバージョンでは、他の表現よりも良いコツがあるかもしれませんが、プラットフォームの違いにも依存する場合があります.あなたの応用を総括して分析し、効率の低い部分を見つけて、これらのコツを試して、問題を解決する最善の方法を見つける必要があります.
    著者はOneAPMエンジニアで、より良い技術記事を読みたいと思っています.OneAPM公式技術ブログにアクセスしてください.