ホームページ >バックエンド開発 >Python チュートリアル >Python のローカル変数は、グローバル、属性、スロットに比べてどれくらい優れていますか?

Python のローカル変数は、グローバル、属性、スロットに比べてどれくらい優れていますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-28 02:07:11524ブラウズ

How much better are python local variables over globals, attributes, or slots?

あるいは、ローカル変数と比較して他の変数はどれくらい悪いですか?

大事なことは何ですか?

一部の記事では、Python プログラマーに対し、頻繁に使用されるローカル変数 (参照されるだけで変更されない場合でも) を使用するようアドバイスしています。

たとえば、以下は「Making Python Programs Blazing Fast」からの 2 つの引用です:

「実際には、関数内のローカル変数 (最速)、クラスレベルの属性 (例: self.name - 遅い)、およびグローバル、たとえば time.time のようなインポートされた関数 (最も遅い) の間でも、検索速度に違いがあります。 。」

「属性にアクセスしないでください

プログラムの速度を低下させるもう 1 つの原因は、オブジェクト属性にアクセスするときに使用されるドット演算子 (.) です。この演算子は、getattribute を使用した辞書検索をトリガーします。これにより、コードに余分なオーバーヘッドが生じます。 「

また、これらが唯一の可能性ではありません。以下の違いについてはどうでしょうか:

  • クラス属性、
  • インスタンス属性、
  • スロットインスタンス属性、
  • メソッド属性、および
  • 関数 (非メソッド) 属性?

テスト

これらすべてを 1,000,000 回の反復でループ内で使用してテストしましたが、内部の反復ごとの作業は最小限でした。クラス外の関数の関数属性をテストするために使用される関数を除き、関数はすべてクラスのメソッドでした。

典型的な関数は次のような形式でした:

      def testINSA(self):
          s=0
          for i in range(10000000):
            s+=self.INSA # what is after the = differs in each function.
          return s    

すべてのコードはこの投稿の下部にあります。

結果

|                                        |      |        | Relative |
| Where                                  | Time | Rate   | Performance |
| LV Local Variable                      | 1.92 | 0.5208 | 100% |
| GV Global Variable                     | 1.99 | 0.5020 | 96% |
| ISA Instance Slotted Attribute         | 2.09 | 0.4789 | 92% |
| CA Class Attribute                     | 3.12 | 0.3204 | 62% |
| INSA Instance Non-Slotted Attribute    | 3.28 | 0.3051 | 59% |
| FA Function Attribute              | 3.49 | 0.2865 | 55% |
| MA Method Attribute                | 6.29 | 0.1589 | 31% |

説明:
パフォーマンスを比較するときは、1 km あたりのリットル数や計算あたりの秒数ではなく、ガロンあたりのマイル数や 1 秒あたりの計算数など、常に (実績 / リソース) を比較してください。

  • 時間 は timeit によって報告されたものであり、有効数字 3 桁に制限されています。
  • レート は時間の逆数です。 1 秒間に何回発生するか。
  • 相対パフォーマンスは、最高のものと比較した割合です。相対的なパフォーマンスを使用すると、大きいほど優れており、2 倍大きいと 2 倍優れています。

調査結果

はい、ローカル変数が最も高速です。

3 つのグループに分類されたさまざまなタイプの変数のパフォーマンス。

  1. ローカル、グローバル、およびクラス インスタンスのスロット付き変数: グローバル変数はローカル変数の 96% 高速であり、クラス インスタンスのスロット付き属性は 92% 高速です。
  2. クラス属性、スロットなしクラス インスタンス属性、および関数属性: これらは、それぞれ、ローカル変数の 62%、59%、および 55% で実行されます。
  3. メソッド属性: メソッド属性の使用は、独自のクラス内で行われ、ローカル変数のパフォーマンスの 31% になります。

結論

驚くべきことに、一般通念と比較すると、グローバル は 2 番目に優れており、クラス内のスロット付きインスタンス属性よりも優れています。もう 1 つの驚きは、メソッド属性が最悪であることです。

コード

      def testINSA(self):
          s=0
          for i in range(10000000):
            s+=self.INSA # what is after the = differs in each function.
          return s    

以上がPython のローカル変数は、グローバル、属性、スロットに比べてどれくらい優れていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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