运行时字节码优化器。

nibbler的Python项目详细描述


nibbler


Python 3.7PyPI versionNot production readyTravis status

nibbler是运行时字节码优化器。

它探索了使用现有的Python语法特征,如^ {EM1} $类型注释EEE>和^ {EM1}$装饰器< EEM >到{STR 1 } $,通过运行额外字节代码优化传递来加速< <强> >代码执行,使用了通过这些手段提供的运行时上下文。

优化过程

  • ^{}
    对用@nibbler.inline修饰的函数的无参数内联调用。
  • ^{}
    将标记为常量(使用Constant类型注释或@nibbler.constant装饰符)的全局变量的值复制到通常必须访问全局命名空间的函数的co_consts元组中,这将加快变量访问。这也适用于内置代码(anyallprint,…)。
  • ^{}
    去掉那些测试窥视孔优化器不接受的常数的条件。
  • ^{}
    如果存在同名的局部变量(主要是^{}的清除通道)
  • ,将全局变量负载转换为局部变量负载。
  • ^{}
    使用附加上下文调用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
  • square函数是内联的(^{})(18-24)
  • 条件(if DEBUG)被去掉,因为DEBUG被声明为常量(^{})(26)
  • print函数被提升为函数级常量(^{})(38)

安装

pip3 install nibbler

常见问题解答

  • 生产准备好了吗?
    地狱号
  • 为什么称为nibbler
    '\(12484;)'/'

现有技术

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java关闭到DB的连接不会关闭所有连接   java如何跟踪eclipse中编译错误的错误?   java设计/实现。。。最有可能使用AJAX   java无法从SharedReference获取数据   在java中,用|将印地语段落串成   java以编程方式在单击时创建微调器工作   java对如何完成新程序的困惑?   java停止httpConnection blackberry超时   java为什么继承的静态变量可以被子类的非静态方法访问?   java Spring安全性通过控制器进行身份验证   java类继承和泛型类型   创建票证服务时CAS重定向上的java错误   使用java的sockets对等应用程序