Skip to content

Commit 632f23e

Browse files
author
Jean-Francois Zinque
committed
PERF: Benchmark MultiIndex set ops on multiple dtypes
1 parent d698c81 commit 632f23e

File tree

1 file changed

+25
-12
lines changed

1 file changed

+25
-12
lines changed

asv_bench/benchmarks/multiindex_object.py

+25-12
Original file line numberDiff line numberDiff line change
@@ -164,25 +164,38 @@ class SetOperations:
164164

165165
params = [
166166
("monotonic", "non_monotonic"),
167+
("datetime", "int", "string"),
167168
("intersection", "union", "symmetric_difference"),
168169
]
169-
param_names = ["index_structure", "method"]
170+
param_names = ["index_structure", "dtype", "method"]
170171

171-
def setup(self, index_structure, method):
172+
def setup(self, index_structure, dtype, method):
172173
N = 10 ** 5
173-
values = np.arange(N)
174+
level1 = range(1000)
175+
176+
level2 = date_range(start="1/1/2000", periods=N // 1000)
177+
dates_left = MultiIndex.from_product([level1, level2])
178+
179+
level2 = range(N // 1000)
180+
int_left = MultiIndex.from_product([level1, level2])
181+
182+
level2 = tm.makeStringIndex(N // 1000).values
183+
str_left = MultiIndex.from_product([level1, level2])
184+
185+
data = {
186+
"datetime": dates_left,
187+
"int": int_left,
188+
"string": str_left,
189+
}
174190

175-
if index_structure == "monotonic":
176-
mi = MultiIndex.from_arrays([values, values])
177-
else:
178-
mi = MultiIndex.from_arrays(
179-
[np.concatenate([values[::2], values[1::2]]), values]
180-
)
191+
if index_structure == "non_monotonic":
192+
data = {k: mi[::-1] for k, mi in data.items()}
181193

182-
self.left = mi
183-
self.right = mi[:-1]
194+
data = {k: {"left": mi, "right": mi[:-1]} for k, mi in data.items()}
195+
self.left = data[dtype]["left"]
196+
self.right = data[dtype]["right"]
184197

185-
def time_operation(self, index_structure, method):
198+
def time_operation(self, index_structure, dtype, method):
186199
getattr(self.left, method)(self.right)
187200

188201

0 commit comments

Comments
 (0)