首頁 >後端開發 >Python教學 >python 局部變數比全域變數、屬性或槽好多少?

python 局部變數比全域變數、屬性或槽好多少?

Barbara Streisand
Barbara Streisand原創
2024-12-28 02:07:11527瀏覽

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

或者說,其他的比局部變數差多少?

有什麼大不了的?

有些文章建議Python程式設計師如果會經常使用局部變量,即使只是引用但不改變。

例如,以下是「Making Python Programs Blazing Fast」中的兩句話:

「實際上,甚至在函數中的局部變數(最快)、類別級屬性(例如self.name - 較慢)和全域(例如time.time 等導入函數)之間,查找速度也存在差異(最慢) 」。

「不要存取屬性

另一個可能會減慢程式速度的事情是存取物件屬性時使用的點運算子 (.)。此運算子使用 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% |

說明:
比較效能時,請始終比較(成就/資源),例如每加侖英里數或每秒計算數,而不是每公里升數或每計算秒數。

  • 時間由timeit報告,限制為3位有效數字。
  • 速率是時間的倒數。每秒有幾個。
  • 相對錶現是與最佳表現相比的比值。透過使用相對性能,越大越好,兩倍大就是兩倍好。

發現

是的,局部變數是最快的。

不同類型變數的表現分為三組。

  1. 本地變數、全域變數和類別實例槽變數:全域變數的速度比本地變數快 96%,而類別實例槽屬性的速度是本地變數的 92%。
  2. 類別屬性、非槽類別實例屬性和函數屬性:它們分別以局部變數的 62%、59% 和 55% 執行。
  3. 方法屬性:使用方法屬性是在它自己的類別中,其表現是局部變數的 31%。

結論

令人驚訝的是,與常識相比,全域變數是第二好的,甚至比類別中的開槽實例屬性更好。另一個令人驚訝的是方法屬性是最差的。

程式碼

      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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn