Skip to content

Instantly share code, notes, and snippets.

@graingert
Created May 12, 2025 06:45
Show Gist options
  • Save graingert/e29c57cc7d5a5fec97ea5a063abdf775 to your computer and use it in GitHub Desktop.
Save graingert/e29c57cc7d5a5fec97ea5a063abdf775 to your computer and use it in GitHub Desktop.

Revisions

  1. graingert created this gist May 12, 2025.
    107 changes: 107 additions & 0 deletions demo.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,107 @@
    import sys
    from typing import Self, cast
    import dataclasses

    @dataclasses.dataclass(slots=False)
    class Node:
    _parent: Self | None

    MessagePump = Node
    DOMNode = Node


    def mk_nodes():
    node = Node(None)
    for i in range(1000000):
    node = Node(node)

    return node

    def ancestors_with_self_traditional(self):
    nodes = []
    node: Node | None = self

    while node is not None:
    nodes.append(node)
    node = node._parent

    return nodes

    def ancestors_with_self_traditional_while_true_invert_cond_return(self):
    nodes = []
    node: Node | None = self

    while True:
    if node is None:
    return nodes

    nodes.append(node)
    node = node._parent


    def ancestors_with_self_traditional_while_true_invert_cond_break(self):
    nodes = []
    node: Node | None = self

    while True:
    if node is None:
    break

    nodes.append(node)
    node = node._parent

    return nodes


    def ancestors_with_self_traditional_while_true_break(self):
    nodes = []
    node: Node | None = self

    while True:
    if node is not None:
    nodes.append(node)
    node = node._parent
    else:
    break

    return nodes

    def ancestors_with_self_traditional_while_true_return(self):
    nodes = []
    node: Node | None = self

    while True:
    if node is not None:
    nodes.append(node)
    node = node._parent
    else:
    return nodes

    return nodes




    import pyperf

    def main():
    runner = pyperf.Runner()
    runner.timeit(name="flatten a linked list tradition",
    stmt="demo.ancestors_with_self_traditional(nodes)",
    setup="import demo; nodes = demo.mk_nodes()")
    runner.timeit(name="flatten a linked list tradition while true, invert cond (return)",
    stmt="demo.ancestors_with_self_traditional_while_true_invert_cond_return(nodes)",
    setup="import demo; nodes = demo.mk_nodes()")
    runner.timeit(name="flatten a linked list tradition while true, invert cond (break)",
    stmt="demo.ancestors_with_self_traditional_while_true_invert_cond_break(nodes)",
    setup="import demo; nodes = demo.mk_nodes()")
    runner.timeit(name="flatten a linked list tradition while true, (break)",
    stmt="demo.ancestors_with_self_traditional_while_true_break(nodes)",
    setup="import demo; nodes = demo.mk_nodes()")
    runner.timeit(name="flatten a linked list tradition while true, (return)",
    stmt="demo.ancestors_with_self_traditional_while_true_return(nodes)",
    setup="import demo; nodes = demo.mk_nodes()")


    if __name__ == "__main__":
    sys.exit(main())