运行时字节码优化器。

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如何显示因用户而异的SQLite存储数据?   转换java。sql。将映射传递给Jackon的valueToTree方法时StringNode的时间戳   从java中的列表json获取值   unicode Java字符存储在什么编码中?   java如何让Spring数据存储库中的默认方法命中缓存?   java使用readClassDescriptor()和resolveClass()来允许序列化版本控制   数组通过另一个矩阵的一部分填充矩阵   如果包含使用正则表达式的字符串,则替换父XML标记的java   java清除SharedReference中的单个变量   java将变量值从一个jsp页面传输到另一个jsp页面   java JDBC+SQLite:DriveManager不加载所需的驱动程序   相同源代码的java Kotlin构建生成不同的二进制文件   Java中的元组枚举