Sitelet https://web.archive.org/web/20201127173509/https://github.com/brandtbucher/hax
Skip to content
master
Go to file
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
hax
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

README.md

HAX

latest versionlatest release datebuild statusissues


HAX lets you write compiled bytecode inline with pure Python. It was originally built for exploring new improvements to CPython's compiler and peephole optimizer.

Installation

HAX supports CPython 3.6+ on all platforms.

To install, just run:

$ pip install hax

Example

Consider the following function; it accepts a sequence of items, and returns a list with each item repeated twice:

def doubled(items):
    out = []
    for item in items:
        out += item, item
    return out            

For example, doubled((0, 1, 2)) returns [0, 0, 1, 1, 2, 2].

We can make this function faster by keeping out on the stack (instead of in a local variable) and using the LIST_APPEND op to build it. HAX makes it simple to inline these instructions:

from hax import *

@hax 
def doubled(items):

    BUILD_LIST(0)

    for item in items:

        LOAD_FAST("item")
        DUP_TOP()
        LIST_APPEND(3)
        LIST_APPEND(2)

    RETURN_VALUE()

With the help of labeled jump targets, the function can be further sped up by rewriting the for-loop in bytecode, removing all temporary variables, and operating entirely on the stack:

from hax import *

@hax 
def doubled(items):

    BUILD_LIST(0)

    LOAD_FAST("items")
    GET_ITER()
    LABEL("loop")
    FOR_ITER("return")

    DUP_TOP()
    LIST_APPEND(3)
    LIST_APPEND(2)
    JUMP_ABSOLUTE("loop")

    LABEL("return")
    RETURN_VALUE()

It's important to realize that the functions HAX provides (BUILD_LIST, LOAD_FAST, ...) aren't just "emulating" their respective bytecode instructions; the @hax decorator detects them, and completely recompiles double's code to use the actual ops that we've specified here!

These performance improvements are impossible to get from CPython's compiler and optimizer alone.

About

Write compiled bytecode inline with pure Python. πŸ€–

Topics

Resources

License

Packages

No packages published

Languages

You can’t perform that action at this time.