Skip to content

Commit 0fbd161

Browse files
Iteration 127: Add 8 benchmark pairs (353 total, re-establishing from real 345 baseline)
Run: https://github.com/githubnext/tsessebe/actions/runs/24511277028 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent a0d31b4 commit 0fbd161

16 files changed

Lines changed: 399 additions & 0 deletions
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
"""Benchmark: DataFrameGroupBy.ngroups and .groups property access."""
2+
import json
3+
import time
4+
import pandas as pd
5+
6+
ROWS = 10_000
7+
WARMUP = 5
8+
ITERATIONS = 50
9+
10+
df = pd.DataFrame({
11+
"key": [f"g{i % 100}" for i in range(ROWS)],
12+
"val": [i * 1.5 for i in range(ROWS)],
13+
})
14+
gbk = df.groupby("key")
15+
16+
for _ in range(WARMUP):
17+
gbk.ngroups
18+
list(gbk.groups.keys())
19+
20+
t0 = time.perf_counter()
21+
for _ in range(ITERATIONS):
22+
gbk.ngroups
23+
list(gbk.groups.keys())
24+
total = (time.perf_counter() - t0) * 1000
25+
26+
print(json.dumps({"function": "groupby_ngroups", "mean_ms": total / ITERATIONS, "iterations": ITERATIONS, "total_ms": total}))
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
"""Benchmark: Index.get_loc (pandas equivalent)."""
2+
import json
3+
import time
4+
import pandas as pd
5+
6+
SIZE = 10_000
7+
WARMUP = 5
8+
ITERATIONS = 30
9+
10+
idx = pd.Index(range(SIZE))
11+
12+
for _ in range(WARMUP):
13+
idx.get_loc(5000)
14+
15+
t0 = time.perf_counter()
16+
for i in range(ITERATIONS):
17+
idx.get_loc(i % SIZE)
18+
total = (time.perf_counter() - t0) * 1000
19+
20+
print(json.dumps({"function": "index_getloc", "mean_ms": total / ITERATIONS, "iterations": ITERATIONS, "total_ms": total}))
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
"""Benchmark: merge with left_on/right_on (pandas equivalent)."""
2+
import json
3+
import time
4+
import pandas as pd
5+
6+
ROWS = 20_000
7+
WARMUP = 3
8+
ITERATIONS = 10
9+
10+
left = pd.DataFrame({
11+
"emp_id": list(range(ROWS)),
12+
"salary": [30000 + i * 10 for i in range(ROWS)],
13+
})
14+
right = pd.DataFrame({
15+
"id": list(range(ROWS // 2)),
16+
"dept": [f"dept{i % 10}" for i in range(ROWS // 2)],
17+
})
18+
19+
for _ in range(WARMUP):
20+
pd.merge(left, right, left_on="emp_id", right_on="id")
21+
22+
t0 = time.perf_counter()
23+
for _ in range(ITERATIONS):
24+
pd.merge(left, right, left_on="emp_id", right_on="id")
25+
total = (time.perf_counter() - t0) * 1000
26+
27+
print(json.dumps({"function": "merge_left_on_right_on", "mean_ms": total / ITERATIONS, "iterations": ITERATIONS, "total_ms": total}))
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
"""Benchmark: MultiIndex.__contains__ (pandas equivalent)."""
2+
import json
3+
import time
4+
import pandas as pd
5+
6+
SIZE = 5_000
7+
WARMUP = 5
8+
ITERATIONS = 50
9+
10+
arr1 = [f"a{i % 50}" for i in range(SIZE)]
11+
arr2 = [i % 100 for i in range(SIZE)]
12+
mi = pd.MultiIndex.from_arrays([arr1, arr2])
13+
14+
for _ in range(WARMUP):
15+
("a0", 0) in mi
16+
17+
t0 = time.perf_counter()
18+
for i in range(ITERATIONS):
19+
(f"a{i % 50}", i % 100) in mi
20+
total = (time.perf_counter() - t0) * 1000
21+
22+
print(json.dumps({"function": "multi_index_contains", "mean_ms": total / ITERATIONS, "iterations": ITERATIONS, "total_ms": total}))
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
"""Benchmark: MultiIndex.from_arrays (pandas equivalent)."""
2+
import json
3+
import time
4+
import pandas as pd
5+
6+
SIZE = 5_000
7+
WARMUP = 3
8+
ITERATIONS = 20
9+
10+
arr1 = [f"a{i % 50}" for i in range(SIZE)]
11+
arr2 = [i % 100 for i in range(SIZE)]
12+
13+
for _ in range(WARMUP):
14+
pd.MultiIndex.from_arrays([arr1, arr2])
15+
16+
t0 = time.perf_counter()
17+
for _ in range(ITERATIONS):
18+
pd.MultiIndex.from_arrays([arr1, arr2])
19+
total = (time.perf_counter() - t0) * 1000
20+
21+
print(json.dumps({"function": "multi_index_fromarrays", "mean_ms": total / ITERATIONS, "iterations": ITERATIONS, "total_ms": total}))
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
"""Benchmark: MultiIndex.from_product (pandas equivalent)."""
2+
import json
3+
import time
4+
import pandas as pd
5+
6+
WARMUP = 3
7+
ITERATIONS = 30
8+
9+
level1 = [f"a{i}" for i in range(50)]
10+
level2 = list(range(100))
11+
12+
for _ in range(WARMUP):
13+
pd.MultiIndex.from_product([level1, level2])
14+
15+
t0 = time.perf_counter()
16+
for _ in range(ITERATIONS):
17+
pd.MultiIndex.from_product([level1, level2])
18+
total = (time.perf_counter() - t0) * 1000
19+
20+
print(json.dumps({"function": "multi_index_fromproduct", "mean_ms": total / ITERATIONS, "iterations": ITERATIONS, "total_ms": total}))
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
"""Benchmark: SeriesGroupBy.apply (pandas equivalent)."""
2+
import json
3+
import time
4+
import pandas as pd
5+
import numpy as np
6+
7+
ROWS = 10_000
8+
WARMUP = 3
9+
ITERATIONS = 20
10+
11+
data = [i * 0.5 for i in range(ROWS)]
12+
by = [i % 100 for i in range(ROWS)]
13+
s = pd.Series(data)
14+
15+
for _ in range(WARMUP):
16+
s.groupby(by).apply(lambda g: g)
17+
18+
t0 = time.perf_counter()
19+
for _ in range(ITERATIONS):
20+
s.groupby(by).apply(lambda g: g - g.mean())
21+
total = (time.perf_counter() - t0) * 1000
22+
23+
print(json.dumps({"function": "series_groupby_apply", "mean_ms": total / ITERATIONS, "iterations": ITERATIONS, "total_ms": total}))
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
"""Benchmark: SeriesGroupBy.filter (pandas equivalent)."""
2+
import json
3+
import time
4+
import pandas as pd
5+
6+
ROWS = 10_000
7+
WARMUP = 3
8+
ITERATIONS = 20
9+
10+
data = [i * 1.0 for i in range(ROWS)]
11+
by = [i % 100 for i in range(ROWS)]
12+
s = pd.Series(data)
13+
14+
for _ in range(WARMUP):
15+
s.groupby(by).filter(lambda g: g.sum() > 1000)
16+
17+
t0 = time.perf_counter()
18+
for _ in range(ITERATIONS):
19+
s.groupby(by).filter(lambda g: g.sum() > 1000)
20+
total = (time.perf_counter() - t0) * 1000
21+
22+
print(json.dumps({"function": "series_groupby_filter", "mean_ms": total / ITERATIONS, "iterations": ITERATIONS, "total_ms": total}))
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/**
2+
* Benchmark: DataFrameGroupBy.ngroups and .groupKeys property access.
3+
*/
4+
import { DataFrame } from "../../src/index.js";
5+
6+
const ROWS = 10_000;
7+
const WARMUP = 5;
8+
const ITERATIONS = 50;
9+
10+
const df = DataFrame.fromColumns({
11+
key: Array.from({ length: ROWS }, (_, i) => `g${i % 100}`),
12+
val: Array.from({ length: ROWS }, (_, i) => i * 1.5),
13+
});
14+
const gbk = df.groupby("key");
15+
16+
for (let i = 0; i < WARMUP; i++) {
17+
gbk.ngroups;
18+
gbk.groupKeys;
19+
}
20+
21+
const t0 = performance.now();
22+
for (let i = 0; i < ITERATIONS; i++) {
23+
gbk.ngroups;
24+
gbk.groupKeys;
25+
}
26+
const total = performance.now() - t0;
27+
28+
console.log(
29+
JSON.stringify({ function: "groupby_ngroups", mean_ms: total / ITERATIONS, iterations: ITERATIONS, total_ms: total }),
30+
);
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* Benchmark: Index.getLoc — locate positions of a label in an index.
3+
*/
4+
import { Index } from "../../src/index.js";
5+
6+
const SIZE = 10_000;
7+
const WARMUP = 5;
8+
const ITERATIONS = 30;
9+
10+
// Index with unique labels
11+
const labels = Array.from({ length: SIZE }, (_, i) => i);
12+
const idx = new Index(labels);
13+
14+
for (let i = 0; i < WARMUP; i++) {
15+
idx.getLoc(5000);
16+
}
17+
18+
const t0 = performance.now();
19+
for (let i = 0; i < ITERATIONS; i++) {
20+
idx.getLoc(i % SIZE);
21+
}
22+
const total = performance.now() - t0;
23+
24+
console.log(
25+
JSON.stringify({ function: "index_getloc", mean_ms: total / ITERATIONS, iterations: ITERATIONS, total_ms: total }),
26+
);

0 commit comments

Comments
 (0)