补丁模块进入和退出 - Python
Patch module entry and exit - Python
我有一个名为 my_module 的模块,我想测量它的性能。
my_module
有多个函数,我想做的是,每当调用模块中的任何函数时
- 记下进入时间
- 记下退出时间
假设我 运行 这个 - my_module.func('blah')
我要打印
- 函数调用开始于 100001201
- 函数调用结束于 100001312
对于模块中的任何函数。
我无法对模块文件进行任何直接更改,因为它也必须在其他地方使用。我只需要这个来打印性能测试脚本。
请帮忙。
我是在 Numpy 模块上做的,所以你应该能够对任何模块使用相同的方法:
import numpy as np # import the module you want to be logged
from inspect import getmembers, isfunction # These will give us the functions in a module
import time # for logging the time
class Object(object): # make a dummy class on which we can do "setattr()"
pass
numpy_with_time_logger = Object() # We are going to make numpy_with_time_logger work exactly like Numpy except that it will also print start and end times
def return_call_time_logger(f): # This function takes in a function and returns a new function!
def call_time_logger(*args, **kargs): # This function is going to substitute f. It runs f(), but it also prints the times.
print(f'Function call started at {time.time()}')
ret_val = f(*args, **kargs)
print(f'Function call ended at {time.time()}')
return ret_val
return call_time_logger
for f_name, f in getmembers(numpy, isfunction): # For every function inside numpy module
# Set numpy_with_time_logger.f_name to be return_call_time_logger(f)
setattr(numpy_with_time_logger, f_name, return_call_time_logger(f))
注意:要使其适用于您自己的模块,只需将 getmembers(numpy, isfunction)
中的“numpy”更改为您导入的模块的名称。
现在,我们的 numpy_with_time_logger 对象设置为完全像 Numpy 一样工作,但它还会打印开始和结束时间。所以尝试通过 numpy_with_time_logger:
使用任何 numpy 的函数
print(numpy_with_time_logger.asarray([1,2]))
输出为:
start time 1615096471.112301
end time 1615096471.1134446
array([1, 2])
此方法存在问题:
如果您调用 numpy_with_time_logger.func1()
并且 numpy_with_time_logger.func1()
调用 numpy.func2()
,那么您将只会获得 func1
的时间日志,而不会获得时间日志func2
.
要访问 Numpy 模块中定义的全局变量,只需继续使用 numpy
,例如numpy.int32
.
我有一个名为 my_module 的模块,我想测量它的性能。
my_module
有多个函数,我想做的是,每当调用模块中的任何函数时
- 记下进入时间
- 记下退出时间
假设我 运行 这个 - my_module.func('blah')
我要打印
- 函数调用开始于 100001201
- 函数调用结束于 100001312
对于模块中的任何函数。
我无法对模块文件进行任何直接更改,因为它也必须在其他地方使用。我只需要这个来打印性能测试脚本。
请帮忙。
我是在 Numpy 模块上做的,所以你应该能够对任何模块使用相同的方法:
import numpy as np # import the module you want to be logged
from inspect import getmembers, isfunction # These will give us the functions in a module
import time # for logging the time
class Object(object): # make a dummy class on which we can do "setattr()"
pass
numpy_with_time_logger = Object() # We are going to make numpy_with_time_logger work exactly like Numpy except that it will also print start and end times
def return_call_time_logger(f): # This function takes in a function and returns a new function!
def call_time_logger(*args, **kargs): # This function is going to substitute f. It runs f(), but it also prints the times.
print(f'Function call started at {time.time()}')
ret_val = f(*args, **kargs)
print(f'Function call ended at {time.time()}')
return ret_val
return call_time_logger
for f_name, f in getmembers(numpy, isfunction): # For every function inside numpy module
# Set numpy_with_time_logger.f_name to be return_call_time_logger(f)
setattr(numpy_with_time_logger, f_name, return_call_time_logger(f))
注意:要使其适用于您自己的模块,只需将 getmembers(numpy, isfunction)
中的“numpy”更改为您导入的模块的名称。
现在,我们的 numpy_with_time_logger 对象设置为完全像 Numpy 一样工作,但它还会打印开始和结束时间。所以尝试通过 numpy_with_time_logger:
使用任何 numpy 的函数print(numpy_with_time_logger.asarray([1,2]))
输出为:
start time 1615096471.112301
end time 1615096471.1134446
array([1, 2])
此方法存在问题:
如果您调用 numpy_with_time_logger.func1()
并且 numpy_with_time_logger.func1()
调用 numpy.func2()
,那么您将只会获得 func1
的时间日志,而不会获得时间日志func2
.
要访问 Numpy 模块中定义的全局变量,只需继续使用 numpy
,例如numpy.int32
.