python效能分析之log

2021-10-10 23:01:19 字數 2888 閱讀 7438

最近在優化乙個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...