关于python:为什么inspect.currentframe比sys. _getframe慢

Why is inspect.currentframe slower than sys. _getframe?

以下是这个答案:https://stackoverflow.com/a/17366561/1982118

在我的MacBook Pro 2015(2.8 GHz Intel Core i7)和python 3.6上,我得到:

1
2
3
4
5
6
python3 -m timeit -s 'import inspect' 'inspect.currentframe().f_code.co_name'
>>> 1000000 loops, best of 3: 0.428 usec per loop

python3 -m timeit -s 'import sys' 'sys._getframe().f_code.co_name'

>>> 10000000 loops, best of 3: 0.114 usec per loop

使用sys.getframe()比inspect.currentframe()快4倍。

怎么会?


假设问题是关于cpython的,您可以在这里看到inspect.currentframe的实现:

1
2
3
def currentframe():
   """Return the frame of the caller or None if this is not possible."""
    return sys._getframe(1) if hasattr(sys,"_getframe") else None

该函数除了调用sys._getframe外,还调用hasattr,因此它必须变慢。

hasattr通过尝试获取属性并捕获AttributeError异常(如果失败)来工作。_getframe属性存在并再次被检索,从而增加了开销。