Created
May 12, 2025 06:45
-
-
Save graingert/e29c57cc7d5a5fec97ea5a063abdf775 to your computer and use it in GitHub Desktop.
Revisions
-
graingert created this gist
May 12, 2025 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal 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())