GitXplorerGitXplorer
b

hax

public
75 stars
4 forks
8 issues

Commits

List of commits on branch master.
Verified
add83a96a13458d66c42a8f58860e8fc25520fe4

Update README.md (#13)

bbrandtbucher committed 2 years ago
Verified
cb63156dab52f755baef13e8dda61e3a2c102bb1

Update README.md

ccoolcoder613eb committed 2 years ago
Verified
88d5815083ca8faab271ec18be163ca596ec56b0

Fix badge

bbrandtbucher committed 2 years ago
Verified
a853cbbcfc08a1e7ba8ee6550385cebd4f5f7038

Update my email

bbrandtbucher committed 3 years ago
Unverified
512d8b3213a7a23befd8367e89d9d5a2e9d10d40

More CI fixes

bbrandtbucher committed 3 years ago
Unverified
cfc8f8383e56bd011a0fba7dba5c573a89d404f0

Whoops...

bbrandtbucher committed 3 years ago

README

The README file for this repository.

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.7-3.10 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 (HAX_LABEL), 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()
    HAX_LABEL("loop")
    FOR_ITER("return")

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

    HAX_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 doubled'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.