我在檔案 myfile.py 中有一組函式,我想為每個函式自動添加一個計時器列印:(大約有 700 個函式)
def myfunXXX()
mytime.start()
mytime.end()
mytime.start(): to= time.time()
mytime.end(): print(time.time() - t0)
目前的解決方案是:
- 手動為所有函式添加裝飾器。
- 將代碼片段添加到所有函式中
有沒有辦法“破解” Python 和函式基礎定義,以便在執行之前和在執行結束時為一組 Python 函式添加這兩個函式?
也許使用 AST 并注入一些字串代碼?
uj5u.com熱心網友回復:
sys.setprofile正是為此而生的。
確保您根據frame.f_code.co_filename僅停止所需檔案進行過濾。
通話事件啟動計時器,回傳停止。
確保您time.perf_counter用作計時器。其他的不太可靠。
請記住,作為檢查模塊中所有函式的任何其他分析器,尤其是用 Python 撰寫的函式,它會減慢您的代碼速度。
uj5u.com熱心網友回復:
如果您愿意修改呼叫這些函式的位置,一種解決方案是執行以下操作:
import time
def wrapper(function,args):
start = time.time()
function(args)
end = time.time()
print(end-start)
我知道您不想添加裝飾器,因為您有很多功能可以添加它們。如果您愿意將您的函式放在一個類中,您可能會發現這個答案或這個答案對自動將裝飾器添加到類很有用。
uj5u.com熱心網友回復:
補丁類的裝飾器是一種“黑客”。
def _task(cls):
og_attrs = cls.__getattribute__
def new_getattrs(self, name):
return og_attrs(self, name)
cls.__getattribute__ = new_getattrs
return cls
@_task # mass change in class method's behavior
class A:
def reborn_function(self):
pass
您的整個問題可能不會立即消失。但這是你必須向后兼容和優雅的最接近的東西。如果您擔心 API 更改或向后兼容性,Ast 將是一個錯誤的舉動。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/420269.html
標籤:
下一篇:引數傳入函式
