Skip to content

Commit ecf7c9b

Browse files
Iteration 299: Add benchmarks for truncate, filter_labels, assign, transform_agg
Run: https://github.com/githubnext/tsessebe/actions/runs/25152235433 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 92a095f commit ecf7c9b

8 files changed

Lines changed: 244 additions & 0 deletions

‎benchmarks/pandas/bench_assign.py‎

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
"""Benchmark: DataFrame.assign — add computed columns to a 100k-row DataFrame"""
2+
import json, time
3+
import numpy as np
4+
import pandas as pd
5+
6+
ROWS = 100_000
7+
WARMUP = 3
8+
ITERATIONS = 10
9+
10+
df = pd.DataFrame({
11+
"a": np.arange(ROWS, dtype=float),
12+
"b": np.arange(ROWS, dtype=float) * 2,
13+
})
14+
15+
for _ in range(WARMUP):
16+
df.assign(c=lambda d: d["a"] + d["b"])
17+
18+
start = time.perf_counter()
19+
for _ in range(ITERATIONS):
20+
df.assign(c=lambda d: d["a"] + d["b"])
21+
total = (time.perf_counter() - start) * 1000
22+
23+
print(json.dumps({
24+
"function": "assign",
25+
"mean_ms": total / ITERATIONS,
26+
"iterations": ITERATIONS,
27+
"total_ms": total,
28+
}))
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
"""Benchmark: DataFrame.filter by items on 100k-row DataFrame"""
2+
import json, time
3+
import numpy as np
4+
import pandas as pd
5+
6+
ROWS = 100_000
7+
WARMUP = 3
8+
ITERATIONS = 10
9+
10+
df = pd.DataFrame({
11+
"alpha": np.arange(ROWS, dtype=float),
12+
"beta": np.arange(ROWS, dtype=float) * 2,
13+
"gamma": np.arange(ROWS, dtype=float) * 3,
14+
"delta": np.arange(ROWS, dtype=float) * 4,
15+
"epsilon": np.arange(ROWS, dtype=float) * 5,
16+
})
17+
18+
for _ in range(WARMUP):
19+
df.filter(items=["alpha", "gamma", "epsilon"])
20+
21+
start = time.perf_counter()
22+
for _ in range(ITERATIONS):
23+
df.filter(items=["alpha", "gamma", "epsilon"])
24+
total = (time.perf_counter() - start) * 1000
25+
26+
print(json.dumps({
27+
"function": "filter_labels",
28+
"mean_ms": total / ITERATIONS,
29+
"iterations": ITERATIONS,
30+
"total_ms": total,
31+
}))
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
"""Benchmark: Series.transform — transform a 100k-element Series"""
2+
import json, time
3+
import numpy as np
4+
import pandas as pd
5+
6+
ROWS = 100_000
7+
WARMUP = 3
8+
ITERATIONS = 10
9+
10+
data = (np.arange(ROWS) % 500) + 1.0
11+
idx = np.arange(ROWS) % 500
12+
s = pd.Series(data, index=idx)
13+
14+
for _ in range(WARMUP):
15+
s.transform("mean")
16+
17+
start = time.perf_counter()
18+
for _ in range(ITERATIONS):
19+
s.transform("mean")
20+
total = (time.perf_counter() - start) * 1000
21+
22+
print(json.dumps({
23+
"function": "transform_agg",
24+
"mean_ms": total / ITERATIONS,
25+
"iterations": ITERATIONS,
26+
"total_ms": total,
27+
}))
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
"""Benchmark: truncate on 100k-element Series"""
2+
import json, time
3+
import numpy as np
4+
import pandas as pd
5+
6+
ROWS = 100_000
7+
WARMUP = 3
8+
ITERATIONS = 10
9+
10+
data = np.arange(ROWS) * 0.5
11+
s = pd.Series(data, index=np.arange(ROWS))
12+
13+
for _ in range(WARMUP):
14+
s.truncate(before=10_000, after=90_000)
15+
16+
start = time.perf_counter()
17+
for _ in range(ITERATIONS):
18+
s.truncate(before=10_000, after=90_000)
19+
total = (time.perf_counter() - start) * 1000
20+
21+
print(json.dumps({
22+
"function": "truncate",
23+
"mean_ms": total / ITERATIONS,
24+
"iterations": ITERATIONS,
25+
"total_ms": total,
26+
}))

‎benchmarks/tsb/bench_assign.ts‎

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/**
2+
* Benchmark: dataFrameAssign — add computed columns to a 100k-row DataFrame
3+
*/
4+
import { DataFrame, dataFrameAssign } from "../../src/index.js";
5+
6+
const ROWS = 100_000;
7+
const WARMUP = 3;
8+
const ITERATIONS = 10;
9+
10+
const df = DataFrame.fromColumns({
11+
a: Float64Array.from({ length: ROWS }, (_, i) => i),
12+
b: Float64Array.from({ length: ROWS }, (_, i) => i * 2),
13+
});
14+
15+
for (let i = 0; i < WARMUP; i++) {
16+
dataFrameAssign(df, {
17+
c: (d: DataFrame) => d.col("a").add(d.col("b")),
18+
});
19+
}
20+
21+
const start = performance.now();
22+
for (let i = 0; i < ITERATIONS; i++) {
23+
dataFrameAssign(df, {
24+
c: (d: DataFrame) => d.col("a").add(d.col("b")),
25+
});
26+
}
27+
const total = performance.now() - start;
28+
29+
console.log(
30+
JSON.stringify({
31+
function: "assign",
32+
mean_ms: total / ITERATIONS,
33+
iterations: ITERATIONS,
34+
total_ms: total,
35+
}),
36+
);
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/**
2+
* Benchmark: filterDataFrame by items and regex on 100k-row DataFrame
3+
*/
4+
import { DataFrame, filterDataFrame } from "../../src/index.js";
5+
6+
const ROWS = 100_000;
7+
const WARMUP = 3;
8+
const ITERATIONS = 10;
9+
10+
const df = DataFrame.fromColumns({
11+
alpha: Float64Array.from({ length: ROWS }, (_, i) => i),
12+
beta: Float64Array.from({ length: ROWS }, (_, i) => i * 2),
13+
gamma: Float64Array.from({ length: ROWS }, (_, i) => i * 3),
14+
delta: Float64Array.from({ length: ROWS }, (_, i) => i * 4),
15+
epsilon: Float64Array.from({ length: ROWS }, (_, i) => i * 5),
16+
});
17+
18+
// Filter by items
19+
for (let i = 0; i < WARMUP; i++) {
20+
filterDataFrame(df, { items: ["alpha", "gamma", "epsilon"] });
21+
}
22+
23+
const start = performance.now();
24+
for (let i = 0; i < ITERATIONS; i++) {
25+
filterDataFrame(df, { items: ["alpha", "gamma", "epsilon"] });
26+
}
27+
const total = performance.now() - start;
28+
29+
console.log(
30+
JSON.stringify({
31+
function: "filter_labels",
32+
mean_ms: total / ITERATIONS,
33+
iterations: ITERATIONS,
34+
total_ms: total,
35+
}),
36+
);
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/**
2+
* Benchmark: seriesTransform — transform a 100k-element Series
3+
*/
4+
import { Series, seriesTransform } from "../../src/index.js";
5+
6+
const ROWS = 100_000;
7+
const WARMUP = 3;
8+
const ITERATIONS = 10;
9+
10+
const data = Float64Array.from({ length: ROWS }, (_, i) => (i % 500) + 1);
11+
const s = new Series({ data, index: Array.from({ length: ROWS }, (_, i) => i % 500) });
12+
13+
for (let i = 0; i < WARMUP; i++) {
14+
seriesTransform(s, "mean");
15+
}
16+
17+
const start = performance.now();
18+
for (let i = 0; i < ITERATIONS; i++) {
19+
seriesTransform(s, "mean");
20+
}
21+
const total = performance.now() - start;
22+
23+
console.log(
24+
JSON.stringify({
25+
function: "transform_agg",
26+
mean_ms: total / ITERATIONS,
27+
iterations: ITERATIONS,
28+
total_ms: total,
29+
}),
30+
);

‎benchmarks/tsb/bench_truncate.ts‎

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/**
2+
* Benchmark: truncateSeries on 100k-element Series
3+
*/
4+
import { Series, truncateSeries } from "../../src/index.js";
5+
6+
const ROWS = 100_000;
7+
const WARMUP = 3;
8+
const ITERATIONS = 10;
9+
10+
const data = Float64Array.from({ length: ROWS }, (_, i) => i * 0.5);
11+
const s = new Series({ data, index: Array.from({ length: ROWS }, (_, i) => i) });
12+
13+
for (let i = 0; i < WARMUP; i++) {
14+
truncateSeries(s, 10_000, 90_000);
15+
}
16+
17+
const start = performance.now();
18+
for (let i = 0; i < ITERATIONS; i++) {
19+
truncateSeries(s, 10_000, 90_000);
20+
}
21+
const total = performance.now() - start;
22+
23+
console.log(
24+
JSON.stringify({
25+
function: "truncate",
26+
mean_ms: total / ITERATIONS,
27+
iterations: ITERATIONS,
28+
total_ms: total,
29+
}),
30+
);

0 commit comments

Comments
 (0)