import importlib
import sys
from functools import wraps
def func_wrapper(func):
""
"这里通过一个装饰器来达到狸猫换太子和获取数据的效果"
""
@wraps(func)
def wrapper(*args, **kwargs):
# 记录开始时间
start = time.time()
result = func(*args, **kwargs)
# 统计消耗时间
end = time.time()
print(f
"speed time:{end - start}"
)
return
result
return
wrapper
class MetaPathFinder:
def find_module(self, fullname, path=None):
# 执行时可以看出来在import哪些模块
print(f
'find module:{path}:{fullname}'
)
return
MetaPathLoader()
class MetaPathLoader:
def load_module(self, fullname):
# import的模块都会存放在sys.modules里面, 通过判断可以减少重复import
if
fullname
in
sys.modules:
return
sys.modules[fullname]
# 防止递归调用
finder = sys.meta_path.pop(0)
# 导入 module
module = importlib.import_module(fullname)
if
fullname ==
'time'
:
# 替换函数
module.sleep = func_wrapper(module.sleep)
sys.meta_path.insert(0, finder)
return
module
sys.meta_path.insert(0, MetaPathFinder())
if
__name__ ==
'__main__'
:
import time
time.sleep(1)
# 输出示例:
# find module:datetime
# find module:time
# load module:time
# find module:math
# find module:_datetime
# speed time:1.00073385238647468