我聽說pipenv9.0.2已經釋出,啟動時間有了很大的改進。
我很快就試了一下,但我覺得并不快。是以我用Python3.7的新特性來研究它。
在本文中,我将介紹該特性以及如何使用它。
啟動時間≒導入時間
例如,pipenv -h 的執行時間比顯示幫助消息的時間長得多。
一般來說,當應用程式啟動時,會有一些啟動過程,比如加載環境變量或配置檔案。
對于Python應用程式,導入子產品占用了大部分啟動時間。例如,pipenv --version 花費了大約800ms,而import pipenv 花費了700ms。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiADNyEzLcd3LcJzLcJzdllmVldWYtl2Q3UCcpJHdz9CX05WZpJ3bt8Gd1F2LcJjcn9WTldWYtl2PhFzY4kDMlljYyMDN5gDN40COzAzNxczMx8CXzV2Zh1WafRWYvxGc19CXvlmL1h2cuFWaq5ycldWYtlWLkF2bsBXdvw1LcpDc0RHaiojIsJye.jpg)
顯示子產品的導入時間
Python 3.7有新的特性來顯示導入子產品的時間。
這個特性是通過 -X importtime 選項或 PYTHONPROFILEIMPORTTIM 環境變量來啟用的。
例如,您可以利用以下指令來測試pipenv的導入時間:
或
這裡是一個pipenv --version輸出結果的例子 。
研究導入時間
在輸出的最後面,你會看到這些行:
在最後一行,579479表示 import pipenv 需要579479us。
在導入pipenv的同時,還導入了許多其他子產品。從上面的示例中,您可以看到 pipenv 導入了pipenv.cli。子導入以2個空格縮進。
再看最後一行。507表示運作pipenv子產品時隻需要507us。579479-507=578972us用于子導入。
找出緩慢的部分
我們來從輸出中找到緩慢子樹。我選取了幾行。
pkg_resources
如您所見,導入pkg_resources 很緩慢。
但令人驚訝的是,pkg_resources沒有進行縮進;它不是pipenv的子導入。
這意味着pkg_resources是由pipenv腳本而不是子產品導入的。
壞消息: 導入pkg_resources很慢。這是一個已知的問題,在不破壞向後相容性的情況下很難修複。
好消息: 您可以避免導入pkg_resources!
在安裝了wheel之後,pip會對它進行建構并從建構包進行安裝。
從wheel (.whl)和源碼包(.tar.gz)安裝是不同的過程。
從wheel安裝時,腳本中不使用pkg_resources:
IPython
看下面的部分.
pipenv導入dotenv, dotenv再導入 dotenv.ipython,它再導入IPython。
這就是為什麼pipenv在我的環境中開始很慢; 我已經安裝了IPython。
但是為什麼要導入IPython呢?我閱讀了dotenv源碼,發現它是用于IPython擴充的。
當然,pipenv和許多dotenv使用者并不使用IPython擴充。
我向dotenv送出了一個推送請求,建議dotenv根據需要導入IPython。
由于pipenv有自己的dotenv副本,是以我向pipenv送出了完全删除dotenv.ipython的推送請求。
結論
我可以将 pipenv--version 的時間從800ms減少到500ms。
導入時間分析是研究和優化應用程式啟動時間的好方法。