很多人做性能測試,吧print打開,吧log調到debug級別並使用了streamhandler,那就會瘋狂打印到控制台。
打印控制台會影響代碼性能嗎?這是毫無疑問的,python print會嚴重影響python性能。
有很多人對分布式函數調度框架做性能測試,但在消費函數里面進行print並且框架日志級別沒有設為INFO,造成框架的性能結果嚴重大幅度下降,每次都要解釋很久print是io行為,會嚴重影響代碼的性能。
如果你在對任何python代碼做性能測試,千萬別print,你瘋狂print就會造成代碼性能下降,你萬萬沒想到print也會對性能產生嚴重影響,只是誤以為代碼要優化。
下面就來看證明吧。
調用10萬次add函數求和,使用嚴謹的控制變量法測試,測試用例如下:
1.pycahrm中調用10萬次求和,但不打印結果,統計運行時間 (主要是測試不打印結果和打印少量字符串和打印很長字符串 的影響)
2.pycahrm中調用10萬次求和,打印20個文字左右的長度來顯示求和結果,統計運行時間 (主要是測試不打印結果和打印少量字符串和打印很長字符串 的影響)
3.pycahrm中調用10萬次求和,打印500個文字左右的長度來顯示求和結果,統計運行時間 (主要是測試不打印結果和打印少量字符串和打印很長字符串 的影響)
4.在cmd,把cmd窗口用鼠標縮放調成中等大小,寬10cm高10cm,運行10萬次求和,打印500個文字左右的長度來顯示求和結果,統計運行時間 (主要是用來測試不同窗口大小渲染print的影響)
5.在cmd,把cmd窗口用鼠標縮放調成很小,寬3cm高3cm,運行10萬次求和,打印500個文字左右的長度來顯示求和結果,統計運行時間 (主要是用來測試不同窗口大小渲染print的影響)
6.在cmd,把cmd窗口用鼠標縮放調成最大化,運行10萬次求和,打印500個文字左右的長度來顯示求和結果,統計運行時間(主要是用來測試不同窗口大小渲染print的影響,並且可以對比pycahrm運行時的耗時)
7.在cmd,把cmd窗口用鼠標縮放調成很小,寬3cm高3cm,運行10萬次求和,但不打印結果,統計運行時間 (主要是用來證明不print求和結果性能很好)
測試代碼如下:
import time def add(x,y): return x +y t1 = time.time() for i in range(100000): # 只調用求和函數不打印結果,統計運行時間 # add(i, i * 2) # 打印20個文字左右的長度來顯示求和結果,統計運行時間 # print(f'''{time.strftime("%H:%M:%S")} {i} + {i * 2} = {add(i, i * 2)}''') # 打印500個文字左右的長度來顯示求和結果,統計運行時間 print(f'''python代碼中瘋狂print影響python性能嗎?print是io嗎?結論是做代碼性能測試千萬不要瘋狂print,否則結果嚴重不准確,性能大幅下降。 python代碼中瘋狂print影響python性能嗎?print是io嗎?結論是做代碼性能測試千萬不要瘋狂print,否則結果嚴重不准確,性能大幅下降。 python代碼中瘋狂print影響python性能嗎?print是io嗎?結論是做代碼性能測試千萬不要瘋狂print,否則結果嚴重不准確,性能大幅下降。 python代碼中瘋狂print影響python性能嗎?print是io嗎?結論是做代碼性能測試千萬不要瘋狂print,否則結果嚴重不准確,性能大幅下降。 python代碼中瘋狂print影響python性能嗎?print是io嗎?結論是做代碼性能測試千萬不要瘋狂print,否則結果嚴重不准確,性能大幅下降。 python代碼中瘋狂print影響python性能嗎?print是io嗎?結論是做代碼性能測試千萬不要瘋狂print,否則結果嚴重不准確,性能大幅下降。 python代碼中瘋狂print影響python性能嗎?print是io嗎?結論是做代碼性能測試千萬不要瘋狂print,否則結果嚴重不准確,性能大幅下降。 python代碼中瘋狂print影響python性能嗎?print是io嗎?結論是做代碼性能測試千萬不要瘋狂print,否則結果嚴重不准確,性能大幅下降。 python代碼中瘋狂print影響python性能嗎?print是io嗎?結論是做代碼性能測試千萬不要瘋狂print,否則結果嚴重不准確,性能大幅下降。 python代碼中瘋狂print影響python性能嗎?print是io嗎?結論是做代碼性能測試千萬不要瘋狂print,否則結果嚴重不准確,性能大幅下降。 {time.strftime("%H:%M:%S")} {i} + {i*2} = {add(i,i*2)}''') print("耗時:",time.time() -t1)
運行結果:
1.pycahrm中調用10萬次求和,但不打印結果,統計運行時間 (主要是測試不打印結果和打印少量字符串和打印很長字符串 的影響),耗時0.02秒
2.pycahrm中調用10萬次求和,打印20個文字左右的長度來顯示求和結果,統計運行時間 (主要是測試不打印結果和打印少量字符串和打印很長字符串 的影響),耗時0.89秒
3.pycahrm中調用10萬次求和,打印500個文字左右的長度來顯示求和結果,統計運行時間 (主要是測試不打印結果和打印少量字符串和打印很長字符串 的影響),耗時4.11
4.在cmd,把cmd窗口用鼠標縮放調成中等大小,寬10cm高10cm,運行10萬次求和,打印500個文字左右的長度來顯示求和結果,統計運行時間 (主要是用來測試不同窗口大小渲染print的影響),耗時 1400秒
5.在cmd,把cmd窗口用鼠標縮放調成很小,寬3cm高3cm,運行10萬次求和,打印500個文字左右的長度來顯示求和結果,統計運行時間 (主要是用來測試不同窗口大小渲染print的影響),耗時7100秒
6.在cmd,把cmd窗口用鼠標縮放調成最大化,運行10萬次求和,打印500個文字左右的長度來顯示求和結果,統計運行時間(主要是用來測試不同窗口大小渲染print的影響,並且可以對比pycahrm運行時的耗時),耗時300秒
7.在cmd,把cmd窗口用鼠標縮放調成很小,寬3cm高3cm,運行10萬次求和,但不打印結果,統計運行時間 (主要是用來證明不print求和結果性能很好),耗時0.02秒
解釋一下什么叫 cmd窗口大小:
可以通過鼠標拉伸改變cmd窗口大小。
二、實驗結論:
通過實驗的結果得出結論:
pycahrm下打印短字符串結果比不打印結果耗時增加了40倍。
pycahrm下打印長字符串結果比打印短字符串耗時增加了5倍。
cmd窗口最大化,打印長字符串比pycahrm打印長字符串結果耗時增加了近100倍
cmd窗口調整成3cm大小時候,比cmd窗口最大化,打印長字符串耗時增加了25倍
cmd窗口調整成10cm大小時候,比cmd窗口最大化,打印長字符串耗時增加了5倍
充分的說明瘋狂的進行print會非常顯著嚴重影響代碼的運行速度,print打印到控制台的速度會受到終端渲染性能的影響,
pycahrm是對代碼輸出優化了,會明顯的批量緩存輸出,性能明顯好於在cmd窗口中瘋狂print。
cmd窗口最大化時候,渲染輸出性能最好,cmd窗口調成最小時候,print性能最差。
最好的情況是運行10萬次求和不打印結果,耗時0.02秒,最差的情況是運行10萬次求和並在3cm的cmd窗口中渲染輸出結果耗時7100秒,簡直是相差了數十萬倍,你還以為在代碼里面高頻次的瘋狂print沒影響嗎。
所以有的人在測我的分布式函數調度框架性能時候,我建議在消費函數中別print。並且 @task_deco裝飾器
中設置 log_level=20 ,20就是常量logging.INFO的值,因為這樣會大量減少屏幕控制台的輸出,會使框架消費性能大幅度提高。瘋狂print對性能測試造成嚴重不准確。