最近在優化乙個python專案,裡面包含很多set,list,dict等操作,**行數2000多行,每次執行耗時都在30-50ms,本以為是python語言的動態解析特性導致執行效能太低,便嘗試使用jit工具進行優化,折騰一番之後,效能只提公升20%,遠沒有官方介紹的6倍之多,反覆檢視**,想到了io耗時的問題,而是懷疑log輸出到控制台耗時是否是罪魁禍首,實驗下來發現的確如此。
實驗內容:
分別對比,執行下面**,記錄耗時情況,結果:
結論:1.log寫入檔案效率高於stdout,優先選擇寫檔案
2.log輸出到控制台,直接print和定向到stdout的效率都低於以檔案流的方式寫入/dev/stdout,優先選擇檔案流寫入
3.loguru寫檔案效率都較低,準備自己實現log簡易功能
**
import logging
from loguru import logger
import time
s1 = time.time()
for i in range(1000):
i = i + float("0.0000009998980")
s2 = time.time()
for i in range(1000):
logging.info(f"我是第次記錄log")
s3 = time.time()
for i in range(1000):
logging.error(f"我是第次記錄log")
s4 = time.time()
for i in range(1000):
logger.error(f"我是第次記錄log")
logger.remove(handler_id=none)
s5 = time.time()
for i in range(1000):
logger.error(f"我是第次記錄log")
s6 = time.time()
for i in range(1000):
print(f"我是第次記錄log")
s7 = time.time()
s8 = time.time()
print(f"我是第8次記錄log" * 1000)
s9 = time.time()
logging.error(f"我是第8次記錄log" * 1000)
s10 = time.time()
logger.error(f"我是第8次記錄log" * 1000)
s11 = time.time()
i = 8 + float("0.0000009998980")
s12 = time.time()
f1 = open("/dev/stdout","w")
s13 = time.time()
for i in range(1000):
f1.write(f"我是第次記錄log\n")
s14 = time.time()
f1.close()
f2 = open("./test.log","w")
s15 = time.time()
for i in range(1000):
f2.write(f"我是第次記錄log\n")
s16 = time.time()
f2.close()
logger.add("test.loguru")
s17 = time.time()
for i in range(1000):
logger.error(f"我是第次記錄log\n")
s18 = time.time()
print("執行1000次 加法:", (s2 - s1) * 1000, "ms")
print("執行1000次 空logging:", (s3 - s2) * 1000, "ms")
print("執行1000次 控制台輸出logging:", (s4 - s3) * 1000, "ms")
print("執行1000次 控制台輸出loguru:", (s5 - s4) * 1000, "ms")
print("執行1000次 空loguru:", (s6 - s5) * 1000, "ms")
print("執行1000次 控制台print:", (s7 - s6) * 1000, "ms")
print("執行1次 控制台1000倍字元長度print:", (s9 - s8) * 1000, "ms")
print("執行1次 控制台1000倍字元長度logging:", (s10 - s9) * 1000, "ms")
print("執行1次 控制台1000倍字元長度logger:", (s11 - s10) * 1000, "ms")
print("執行1次 加法:", (s12 - s11) * 1000, "ms")
print("執行1000次 控制台print:", (s7 - s6) * 1000, "ms")
print("執行1000次 python檔案流方式輸出到stdout:", (s14 - s13) * 1000, "ms")
print("執行1000次 python檔案流方式輸出到檔案:", (s16 - s15) * 1000, "ms")
print("執行1000次 loguru檔案流方式輸出到檔案:", (s18 - s17) * 1000, "ms")
實驗機器:
python常見的效能瓶頸:資料庫慢查詢sql、日誌列印、xml大報文解析和格式轉換、複雜業務邏輯、鎖競爭等。
mysql效能log分析工具
啟用slow log 有兩種啟用方式 1,在my.cnf 裡通過 log slow queries file name 2,在 mysqld 程序啟動時,指定 log slow queries file name 選項 比較的五款常用工具 mysqldumpslow,mysqlsla,myprofi...
python效能分析
python的效能分析工具cprofile使用起來比較簡單,如下 python m cprofile o profile.txt py arg1 arg2 其中,py是要分析的python程式入口函式,後面跟的就是對應的引數了。生成的profile.txt是儲存的profile資訊,可以用下面的py...
Python學習 python效能分析
python profiler效能分析 一種方法 if name main import profile profile.run foo 另一種命令列方法 python m profile prof1.py profile的統計結果分為ncalls,tottime,percall,cumtime,p...