<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 18.2.?使用 `timeit` 模塊 關于 Python 代碼優化你需要知道的最重要問題是,決不要自己編寫計時函數。 為一個很短的代碼計時都很復雜。處理器有多少時間用于運行這個代碼?有什么在后臺運行嗎?每個現代計算機都在后臺運行持續或者間歇的程序。小小的疏忽可能破壞你的百年大計,后臺服務偶爾被 “喚醒” 在最后千分之一秒做一些像查收信件,連接計時通信服務器,檢查應用程序更新,掃描病毒,查看是否有磁盤被插入光驅之類很有意義的事。在開始計時測試之前,把一切都關掉,斷開網絡的連接。再次確定一切都關上后關掉那些不斷查看網絡是否恢復的服務等等。 接下來是計時框架本身引入的變化因素。Python 解釋器是否緩存了方法名的查找?是否緩存代碼塊的編譯結果?正則表達式呢? 你的代碼重復運行時有副作用嗎?不要忘記,你的工作結果將以比秒更小的單位呈現,你的計時框架中的小錯誤將會帶來不可挽回的結果扭曲。 Python 社區有句俗語:“Python 自己帶著電池。” 別自己寫計時框架。Python 2.3 具備一個叫做 `timeit` 的完美計時工具。 ## 例?18.2.?`timeit` 介紹 如果您還沒有下載本書附帶的樣例程序, 可以 [下載本程序和其他樣例程序](http://www.woodpecker.org.cn/diveintopython/download/diveintopython-exampleszh-cn-5.4b.zip "Download example scripts")。 ``` >>> import timeit >>> t = timeit.Timer("soundex.soundex('Pilgrim')", ... "import soundex") >>> t.timeit() 8.21683733547 >>> t.repeat(3, 2000000) [16.48319309109, 16.46128984923, 16.44203948912] ``` | | | | --- | --- | | \[1\] | `timeit` 模塊定義了接受兩個參數的 `Timer` 類。兩個參數都是字符串。第一個參數是你要計時的語句,這里你計時的是以`'Pilgrim'`參數調用 Soundex 函數。傳遞給 `Timer` 的第二個參數是為第一個參數語句構建環境的導入語句。從內部講,`timeit` 構建起一個獨立的虛擬環境,手工地執行建立語句 (導入 `soundex` 模塊),然后手工地編譯和執行被計時語句 (調用 Soundex 函數)。 | | \[2\] | 只要有了 `Timer` 對象,最簡單的事就是調用 `timeit()`,它調用你的函數一百萬次并返回所耗費的秒數。 | | \[3\] | `Timer` 對象的另一個主要方法是 `repeat()`,它接受兩個可選參數。第一個參數是重復整個測試的次數,第二個參數是每個測試中調用被計時語句的次數。兩個參數都是可選的,它們的默認值分別是 `3` 和 `1000000`。`repeat()` 方法返回以秒記錄的每個測試循環的耗時列表。 | > 提示 > 你可以在命令行使用 `timeit` 模塊來測試一個已存在的 Python 程序,而不需要修改代碼。在 [http://docs.python.org/lib/node396.html](http://docs.python.org/lib/node396.html) 查看文檔中關于命令行選項的內容。 注意 `repeat()` 返回一個時間列表。由于 Python 計時器使用的處理器時間的微小變化 (或者那些你沒辦法根除的可惡的后臺進程),這些時間中幾乎不可能出現重復。你的第一想法也許是說:“讓我們求平均值獲得真實的數據。” 事實上,那幾乎是確定錯誤的。你的代碼或者 Python 解釋器的變化可能縮短耗時,那些沒辦法去除的可惡后臺進程或者其他 Python 解釋器以外的因素也許令耗時延長。如果計時結果之間的差異超過百分之幾,太多的可變因素使你沒法相信結果,如果不是這樣則可以取最小值而丟棄其他結果。 Python 有一個方便的 `min` 函數返回輸入列表中的最小值: ``` >>> min(t.repeat(3, 1000000)) 8.22203948912 ``` > 提示 > `timeit` 模塊只有在你知道哪段代碼需要優化時使用。如果你有一個很大的 Python 程序并且不知道你的性能問題所在,查看 [`hotshot` 模塊](http://docs.python.org/lib/module-hotshot.html)。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看