Skip to content

Instantly share code, notes, and snippets.

@hackaugusto
Created February 11, 2020 10:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hackaugusto/02bf9383accebdc928f48133e6faab06 to your computer and use it in GitHub Desktop.
Save hackaugusto/02bf9383accebdc928f48133e6faab06 to your computer and use it in GitHub Desktop.
import timeit
setup = "from eth_utils import keccak"
run = "keccak(b'')"
print("keccak")
print(timeit.timeit(run, setup))
setup = "from eth_utils import to_checksum_address"
run = f"to_checksum_address(b'00000000000000000000')"
print("to_checksum_address")
print(timeit.timeit(run, setup))
setup = "from eth_hash.auto import keccak"
run = "keccak(b'')"
print("keccak")
print(timeit.timeit(run, setup))
@hackaugusto
Copy link
Author

keccak
8.858773484000267
to_checksum_address
43.857784765999895
eth_hash
6.6892174479999085

@konradkonrad
Copy link

konradkonrad commented Feb 11, 2020

keccak
9.568517837993568
keccak
7.025889513999573
checksum_encode
11.689389470004244
to_checksum_address
56.00914922199445
from eth_hash.auto import keccak
from eth_utils import to_checksum_address


def checksum_encode(addr):  # Takes a 20-byte binary address as input
    o = ""
    v = int.from_bytes(keccak(addr), byteorder="big")
    for i, c in enumerate(addr.hex()):
        if c in "0123456789":
            o += c
        else:
            o += c.upper() if (v & (2 ** (255 - 4 * i))) else c.lower()
    return "0x" + o


ADDR = b"0" * 20
assert checksum_encode(ADDR) == to_checksum_address(ADDR)

import timeit

setup = "from eth_utils import keccak"
run = "keccak(b'')"

print("keccak")
print(timeit.timeit(run, setup))

setup = "from eth_hash.auto import keccak"
run = "keccak(b'')"

print("keccak")
print(timeit.timeit(run, setup))

setup = """
from eth_hash.auto import keccak
def checksum_encode(addr):  # Takes a 20-byte binary address as input
    o = ""
    v = int.from_bytes(keccak(addr), byteorder="big")
    for i, c in enumerate(addr.hex()):
        if c in "0123456789":
            o += c
        else:
            o += c.upper() if (v & (2 ** (255 - 4 * i))) else c.lower()
    return "0x" + o
"""
run = f"checksum_encode(b'00000000000000000000')"
print("checksum_encode")
print(timeit.timeit(run, setup))

setup = "from eth_utils import to_checksum_address"
run = f"to_checksum_address(b'00000000000000000000')"

print("to_checksum_address")
print(timeit.timeit(run, setup))

@ulope
Copy link

ulope commented Feb 11, 2020

.....................
eth_utils.keccak: Mean +- std dev: 8.69 us +- 0.22 us
.....................
eth_hash.auto.keccak: Mean +- std dev: 6.68 us +- 0.43 us
.....................
eth_utils.to_checksum_address: Mean +- std dev: 46.7 us +- 0.5 us
.....................
checksum_encode: Mean +- std dev: 13.1 us +- 0.4 us
import pyperf

runner = pyperf.Runner()

runner.timeit(
    name="eth_utils.keccak",
    stmt="keccak(b'')",
    setup="from eth_utils import keccak"
)

runner.timeit(
    name="eth_hash.auto.keccak",
    stmt="keccak(b'')",
    setup="from eth_hash.auto import keccak"
)

runner.timeit(
    name="eth_utils.to_checksum_address",
    stmt="to_checksum_address(b'00000000000000000000')",
    setup="from eth_utils import to_checksum_address"
)

runner.timeit(
    name="checksum_encode",
    stmt="checksum_encode(b')a00)0!_.00ds0w3#000')",
    setup="""\
from eth_hash.auto import keccak
def checksum_encode(addr):
    o = ""
    v = int.from_bytes(keccak(addr), byteorder="big")
    for i, c in enumerate(addr.hex()):
        if c in "0123456789":
            o += c
        else:
            o += c.upper() if (v & (2 ** (255 - 4 * i))) else c.lower()
    return "0x" + o
    """
)

@konradkonrad
Copy link

note: the original spec was missing one transcoding -- but even with that, the non-eth_utils implementation is way faster

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment