跟进此答案: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倍。
为什么?
答案 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
属性存在并再次检索,从而增加了开销。