为什么inspect.currentframe比sys慢。 _getframe?

时间:2017-07-19 16:15:31

标签: python

跟进此答案:https://stackoverflow.com/a/17366561/1982118

在我的macbook pro 2015(2.8 GHz Intel Core i7)上使用python 3.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倍。

为什么?

1 个答案:

答案 0 :(得分:4)

假设问题与CPython有关,您可以看到inspect.currentframe here的实现:

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

除了hasattr之外,该函数还会调用sys._getframe,因此 的速度会慢一些。

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