运行时字节码优化器。
nibbler的Python项目详细描述
nibbler是运行时字节码优化器。
它探索了使用现有的Python语法特征,如^ {EM1} $类型注释EEE>和^ {EM1}$装饰器< EEM >到{STR 1 } $,通过运行额外字节代码优化传递来加速< <强> >代码执行,使用了通过这些手段提供的运行时上下文。
优化过程
- ^{
}
对用@nibbler.inline
修饰的函数的无参数内联调用。 - ^{
}
将标记为常量(使用Constant
类型注释或@nibbler.constant
装饰符)的全局变量的值复制到通常必须访问全局命名空间的函数的co_consts
元组中,这将加快变量访问。这也适用于内置代码(any
,all
,print
,…)。 - ^{
}
去掉那些测试窥视孔优化器不接受的常数的条件。 - ^{
}
如果存在同名的局部变量(主要是^{} 的清除通道) ,将全局变量负载转换为局部变量负载。
- ^{
}
使用附加上下文调用Python peephole optimizer。
用法
fromtypingimportIterablefromnibblerimportConstant,NibblerDEBUG:Constant[bool]=Falsenibbler=Nibbler(globals())@nibbler.inlinedefsquare(number:int,base:int)->int:result=number**basereturnresult@nibbler.nibbledefsequential_square(numbers:Iterable[int])->int:product=0base=2fornumberinnumbers:square()ifDEBUG:print(result)product+=resultprint(f"Result: {product}")returnproductsequential_square(range(4))
?
Result: 14
检查函数字节码可以发现哪些优化nibbler已经执行:
2 0 LOAD_CONST 1 (0)
2 STORE_FAST 1 (product)
3 4 LOAD_CONST 2 (2)
6 STORE_FAST 2 (base)
4 8 SETUP_LOOP 28 (to 38)
10 LOAD_FAST 0 (numbers)
12 GET_ITER
>> 14 FOR_ITER 20 (to 36)
16 STORE_FAST 3 (number)
5 18 LOAD_FAST 3 (number)
20 LOAD_FAST 2 (base)
22 BINARY_POWER
24 STORE_FAST 4 (result)
6 26 LOAD_FAST 1 (product)
28 LOAD_FAST 4 (result)
30 INPLACE_ADD
32 STORE_FAST 1 (product)
34 JUMP_ABSOLUTE 14
>> 36 POP_BLOCK
8 >> 38 LOAD_CONST 5 (<built-in function print>)
40 LOAD_CONST 3 ('Result: ')
42 LOAD_FAST 1 (product)
44 FORMAT_VALUE 0
46 BUILD_STRING 2
48 CALL_FUNCTION 1
50 POP_TOP
9 52 LOAD_FAST 1 (product)
54 RETURN_VALUE
安装
pip3 install nibbler
常见问题解答
- 生产准备好了吗?
地狱号 - 为什么称为nibbler?
'\(12484;)'/'