/
bench_match.py
154 lines (132 loc) Β· 4.81 KB
/
bench_match.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
from typing import Mapping, Sequence
def sequence_match_logical():
""" Test matching the first element of a sequence is a frog. """
seq = ["πΈ", "π", "π¦", "πͺ²"]
frogs = 0
for _ in range(100_000):
if isinstance(seq, Sequence) and len(seq) > 0 and seq[0] == "πΈ":
frogs += 1
assert frogs == 100_000
def sequence_match_statement():
""" Test matching the first element of a sequence is a frog. """
seq = ["πΈ", "π", "π¦", "πͺ²"]
frogs = 0
for _ in range(100_000):
match seq:
case ["πΈ", *_]: frogs += 1
assert frogs == 100_000
def literal_match_logical():
""" Test matching of literal values"""
seq = ["π", "π", "π", "π¦", "πͺ²", "π³"]
butterflies = 0
caterpillars = 0
beetles = 0
for _ in range(100_000):
for x in seq:
if x == "π¦":
butterflies += 1
elif x == "π":
caterpillars += 1
elif x == "πͺ²":
beetles += 1
assert butterflies == 100_000
assert beetles == 100_000
assert caterpillars == 100_000
def literal_match_statement():
""" Test matching of literal values """
seq = ["π", "π", "π", "π¦", "πͺ²", "π³"]
butterflies = 0
caterpillars = 0
beetles = 0
for _ in range(100_000):
for x in seq:
match x:
case "π¦": butterflies += 1
case "π": caterpillars += 1
case "πͺ²": beetles += 1
assert butterflies == 100_000
assert beetles == 100_000
assert caterpillars == 100_000
def mapping_match_logical():
""" Test matching of mapping type"""
boats = [
{"π": 1, },
{"π¦": 1, "π½": 1},
{"π": 1, "π½": 1},
{"π": 1, "π¦": 1},
]
problems = 0
valid_boats = 0
for _ in range(100_000):
for boat in boats:
if isinstance(boat, Mapping):
if "π" in boat and "π½" in boat:
problems += 1
elif "π" in boat and "π¦" in boat:
problems += 1
else:
valid_boats += 1
assert valid_boats == 200_000
assert problems == 200_000
def mapping_match_statement():
""" Test matching of mapping type"""
boats = [
{"π": 1, },
{"π¦": 1, "π½": 1},
{"π": 1, "π½": 1},
{"π": 1, "π¦": 1},
]
problems = 0
valid_boats = 0
for _ in range(100_000):
for boat in boats:
match boat:
case {"π": _, "π½": _}: problems += 1
case {"π": _, "π¦": _}: problems += 1
case _: valid_boats += 1
assert valid_boats == 200_000
assert problems == 200_000
class Driver:
def __init__(self, name, team, **extra):
self.name = name
self.team = team
self.extra = extra
def bench_class_matching_statement():
drivers = [
Driver(name="Max Verstappen", team="Red Bull", ),
Driver(name="Sergio Perez", team="Red Bull", ),
Driver(name="Charles Leclerc", team="Ferrari", ),
Driver(name="Lewis Hamilton", team="Mercedes", ),
]
for _ in range(100_000):
for driver in drivers:
match driver:
case Driver(name="Max Verstappen"): desc = f"Max Verstappen, the current world #1"
case Driver(name=name, team="Ferrari"): desc = f"{name}, a Ferrari driver!! π"
case Driver(name=name, team=team): desc = f"{name}, a {team} driver."
case _: desc = "Invalid request"
# print(desc)
def bench_class_matching_logical():
drivers = [
Driver(name="Max Verstappen", team="Red Bull", ),
Driver(name="Sergio Perez", team="Red Bull", ),
Driver(name="Charles Leclerc", team="Ferrari", ),
Driver(name="Lewis Hamilton", team="Mercedes", ),
]
for _ in range(100_000):
for driver in drivers:
if not isinstance(driver, Driver):
desc = "Invalid request"
elif driver.name == "Max Verstappen":
desc = f"Max Verstappen, the current world #1"
elif driver.team == "Ferrari":
desc = f"{driver.name}, a Ferrari driver!! π"
else:
desc = f"{driver.name}, a {driver.team} driver."
# print(desc)
__benchmarks__ = [
(sequence_match_logical, sequence_match_statement, "Match statements (sequence)"),
(literal_match_logical, literal_match_statement, "Match statements (literal)"),
(mapping_match_logical, mapping_match_statement, "Match statements (mapping)"),
(bench_class_matching_logical, bench_class_matching_statement, "Match statements (classes)"),
]