python解释器
标签(空格分隔): python
在阅读TensorFlow源代码时,经常看到解释器这样的一类的东西,打算将这部分知识梳理一下,方便自己后面继续看代码,该部分主要参考这两个博客Python中的解释器、python修饰器的作用
解释器可以算是Python比较高级一点的东西了,什么是解释器呢?就是对函数加以解释,解释器其本质是一个函数,同时它的输入也是一个函数,没错就是在函数中执行函数,当然附加了其他的功能,不然怎么能叫做解释器呢
我们下面看一个例子
import time
def time_it(fn):
print ('time_it is executed')
def new_fn(*args):
start = time.time()
result = fn(*args)
end = time.time()
duration = end - start
print('%s seconds are consumed in executing function:%s%r'\
%(duration, fn.__name__, args))
return result
return new_fn
@time_it
def acc1(start, end):
s = 0
for i in xrange(start, end):
s += i
return s
def acc2(start, end):
s = 0
for i in xrange(start, end):
s += i
return s
print acc1
print acc2
if __name__ == '__main__':
acc1(10, 1000000)
这段程序acc1
、acc2
实现的功能都是从一个数加到另一个数,但是区别是acc1
经过了time_it
的修饰
我们看看这段函数的输出
time_it is executed
<function new_fn at 0x7fde83bfd9b0>
<function acc2 at 0x7fde83bfda28>
0.0198199748993 seconds are consumed in executing function:acc1(10, 1000000)
为了方便说明解释器的运行过程,我在Pycharm上进行调试,首先将断点设置在import
进行DeBug,首先Python会遍历整个程序的def
定义的函数头
当它遍历被解释器修饰的函数就会进入解释器函数,并执行解释器函数
因此,我们可以看到在Console1部分会打印出time_it is executed
函数就会返回一个函数指针new_fn
, 请记住这个函数指针的内存地址0x000002702C0C3EA0
接下来,执行完解释器函数之后,然后 程序依此会向下遍历整个定义的函数,并为它们分配内存地址,现在我们打印定义的两个函数地地址,其中acc1
是被解释器解释过了的,acc2
没有被解释器解释
print(acc1)
print(acc2)
输出结果:
我们可以先被解释器解释过的函数acc1
的地址和之前在解释器函数返回的函数指针是一样的,也就是说
acc1 = new_fn
#也可以这样表示
acc1(start, end) = new_fn(*args) #等于号表示它们执行相同的程序段
因此现在可以明了了,经过@time_it
解释器,其实就是返回一个新的函数指针赋给被修饰的函数,这个函数指针内部其实也调用了被修饰函数的本体,但是,新的函数有着其他的功能,比如说,计时等等
这就是解释器的内部机制!