python解释器

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)

这段程序acc1acc2实现的功能都是从一个数加到另一个数,但是区别是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
image_1cj4s41k9vej1pdl16mg1qnv94n9.png-45.2kB

进行DeBug,首先Python会遍历整个程序的def定义的函数头
image_1cj4s9k9s1n4s1mm213jr5o910ohm.png-45.5kB

当它遍历被解释器修饰的函数就会进入解释器函数,并执行解释器函数

image_1cj4sac3uqd519m25mq16scqmv13.png-39.4kB

因此,我们可以看到在Console1部分会打印出time_it is executed

image_1cj4sd7871akm1ifu1d401hkhs341g.png-87.6kB

函数就会返回一个函数指针new_fn, 请记住这个函数指针的内存地址0x000002702C0C3EA0

image_1cj4sj01psfk1qarhji1tsspmn1t.png-93.9kB

接下来,执行完解释器函数之后,然后 程序依此会向下遍历整个定义的函数,并为它们分配内存地址,现在我们打印定义的两个函数地地址,其中acc1是被解释器解释过了的,acc2没有被解释器解释

print(acc1)
print(acc2)

输出结果:
image_1cj4stocb1egv8q1nm41e8g8h92a.png-73.9kB

我们可以先被解释器解释过的函数acc1的地址和之前在解释器函数返回的函数指针是一样的,也就是说

acc1 = new_fn
#也可以这样表示
acc1(start, end) = new_fn(*args) #等于号表示它们执行相同的程序段

因此现在可以明了了,经过@time_it解释器,其实就是返回一个新的函数指针赋给被修饰的函数,这个函数指针内部其实也调用了被修饰函数的本体,但是,新的函数有着其他的功能,比如说,计时等等

这就是解释器的内部机制!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值