补丁模块进入和退出 - Python

Patch module entry and exit - Python

我有一个名为 my_module 的模块,我想测量它的性能。

my_module 有多个函数,我想做的是,每当调用模块中的任何函数时

假设我 运行 这个 - my_module.func('blah')

我要打印

对于模块中的任何函数。

我无法对模块文件进行任何直接更改,因为它也必须在其他地方使用。我只需要这个来打印性能测试脚本。

请帮忙。

我是在 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.