Skip to content

Commit e75b53e

Browse files
Iteration 130: Add 8 benchmark pairs (364 total, +8 vs best 356)
Added benchmark pairs: skew_kurt, sem_var, mode_series, idxmin_idxmax, dataframe_skew_kurt, dataframe_sem_var, nancumops, clip_advanced. Run: https://github.com/githubnext/tsessebe/actions/runs/24528172385 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 14687fd commit e75b53e

16 files changed

Lines changed: 469 additions & 0 deletions
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
"""
2+
Benchmark: Series.clip(lower_arr, upper_arr) / DataFrame.clip() — per-element clipping with array bounds.
3+
Outputs JSON: {"function": "clip_advanced", "mean_ms": ..., "iterations": ..., "total_ms": ...}
4+
"""
5+
import json
6+
import math
7+
import time
8+
import pandas as pd
9+
import numpy as np
10+
11+
ROWS = 50_000
12+
WARMUP = 5
13+
ITERATIONS = 30
14+
15+
data = np.array([math.sin(i * 0.01) * 200 for i in range(ROWS)])
16+
lower = np.full(ROWS, -50.0)
17+
upper = np.full(ROWS, 50.0)
18+
s = pd.Series(data)
19+
20+
df_data = {f"col{c}": np.array([math.sin((i + c) * 0.01) * 200 for i in range(ROWS)]) for c in range(5)}
21+
df = pd.DataFrame(df_data)
22+
23+
for _ in range(WARMUP):
24+
s.clip(lower=lower, upper=upper)
25+
df.clip(lower=-50, upper=50)
26+
27+
start = time.perf_counter()
28+
for _ in range(ITERATIONS):
29+
s.clip(lower=lower, upper=upper)
30+
df.clip(lower=-50, upper=50)
31+
total = (time.perf_counter() - start) * 1000
32+
33+
print(json.dumps({"function": "clip_advanced", "mean_ms": total / ITERATIONS, "iterations": ITERATIONS, "total_ms": total}))
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
"""
2+
Benchmark: DataFrame.var() / DataFrame.sem() — variance and SEM on a 10k×10 DataFrame.
3+
Outputs JSON: {"function": "dataframe_sem_var", "mean_ms": ..., "iterations": ..., "total_ms": ...}
4+
"""
5+
import json
6+
import math
7+
import time
8+
import pandas as pd
9+
import numpy as np
10+
11+
ROWS = 10_000
12+
COLS = 10
13+
WARMUP = 5
14+
ITERATIONS = 20
15+
16+
data = {f"col{c}": np.array([math.sin((i + c) * 0.01) * 100 for i in range(ROWS)]) for c in range(COLS)}
17+
df = pd.DataFrame(data)
18+
19+
for _ in range(WARMUP):
20+
df.var()
21+
df.sem()
22+
23+
start = time.perf_counter()
24+
for _ in range(ITERATIONS):
25+
df.var()
26+
df.sem()
27+
total = (time.perf_counter() - start) * 1000
28+
29+
print(json.dumps({"function": "dataframe_sem_var", "mean_ms": total / ITERATIONS, "iterations": ITERATIONS, "total_ms": total}))
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
"""
2+
Benchmark: DataFrame.skew() / DataFrame.kurt() — skewness and kurtosis on a 10k×10 DataFrame.
3+
Outputs JSON: {"function": "dataframe_skew_kurt", "mean_ms": ..., "iterations": ..., "total_ms": ...}
4+
"""
5+
import json
6+
import math
7+
import time
8+
import pandas as pd
9+
import numpy as np
10+
11+
ROWS = 10_000
12+
COLS = 10
13+
WARMUP = 5
14+
ITERATIONS = 20
15+
16+
data = {f"col{c}": np.array([math.sin((i + c) * 0.01) * 100 for i in range(ROWS)]) for c in range(COLS)}
17+
df = pd.DataFrame(data)
18+
19+
for _ in range(WARMUP):
20+
df.skew()
21+
df.kurt()
22+
23+
start = time.perf_counter()
24+
for _ in range(ITERATIONS):
25+
df.skew()
26+
df.kurt()
27+
total = (time.perf_counter() - start) * 1000
28+
29+
print(json.dumps({"function": "dataframe_skew_kurt", "mean_ms": total / ITERATIONS, "iterations": ITERATIONS, "total_ms": total}))
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
"""
2+
Benchmark: Series.idxmin() / Series.idxmax() — index of min/max on a 100k-element Series.
3+
Outputs JSON: {"function": "idxmin_idxmax", "mean_ms": ..., "iterations": ..., "total_ms": ...}
4+
"""
5+
import json
6+
import math
7+
import time
8+
import pandas as pd
9+
import numpy as np
10+
11+
SIZE = 100_000
12+
WARMUP = 5
13+
ITERATIONS = 50
14+
15+
data = np.array([math.sin(i * 0.01) * 1000 for i in range(SIZE)])
16+
s = pd.Series(data)
17+
18+
for _ in range(WARMUP):
19+
s.idxmin()
20+
s.idxmax()
21+
22+
start = time.perf_counter()
23+
for _ in range(ITERATIONS):
24+
s.idxmin()
25+
s.idxmax()
26+
total = (time.perf_counter() - start) * 1000
27+
28+
print(json.dumps({"function": "idxmin_idxmax", "mean_ms": total / ITERATIONS, "iterations": ITERATIONS, "total_ms": total}))
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
"""
2+
Benchmark: Series.mode() — mode of a 10k-element integer Series.
3+
Outputs JSON: {"function": "mode_series", "mean_ms": ..., "iterations": ..., "total_ms": ...}
4+
"""
5+
import json
6+
import time
7+
import pandas as pd
8+
9+
SIZE = 10_000
10+
WARMUP = 5
11+
ITERATIONS = 50
12+
13+
data = [i % 200 for i in range(SIZE)]
14+
s = pd.Series(data)
15+
16+
for _ in range(WARMUP):
17+
s.mode()
18+
19+
start = time.perf_counter()
20+
for _ in range(ITERATIONS):
21+
s.mode()
22+
total = (time.perf_counter() - start) * 1000
23+
24+
print(json.dumps({"function": "mode_series", "mean_ms": total / ITERATIONS, "iterations": ITERATIONS, "total_ms": total}))
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
"""
2+
Benchmark: np.nansum / np.nanmean / np.nanvar / np.nanstd — nan-ignoring aggregates on 100k array.
3+
Outputs JSON: {"function": "nancumops", "mean_ms": ..., "iterations": ..., "total_ms": ...}
4+
"""
5+
import json
6+
import math
7+
import time
8+
import numpy as np
9+
10+
SIZE = 100_000
11+
WARMUP = 5
12+
ITERATIONS = 50
13+
14+
# Array with ~10% NaN values
15+
data = np.array([float("nan") if i % 10 == 0 else math.sin(i * 0.01) * 100 for i in range(SIZE)])
16+
17+
for _ in range(WARMUP):
18+
np.nansum(data)
19+
np.nanmean(data)
20+
np.nanvar(data)
21+
np.nanstd(data)
22+
np.nanmin(data)
23+
np.nanmax(data)
24+
25+
start = time.perf_counter()
26+
for _ in range(ITERATIONS):
27+
np.nansum(data)
28+
np.nanmean(data)
29+
np.nanvar(data)
30+
np.nanstd(data)
31+
np.nanmin(data)
32+
np.nanmax(data)
33+
total = (time.perf_counter() - start) * 1000
34+
35+
print(json.dumps({"function": "nancumops", "mean_ms": total / ITERATIONS, "iterations": ITERATIONS, "total_ms": total}))

benchmarks/pandas/bench_sem_var.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
"""
2+
Benchmark: Series.var() / Series.sem() — variance and SEM on a 100k-element Series.
3+
Outputs JSON: {"function": "sem_var", "mean_ms": ..., "iterations": ..., "total_ms": ...}
4+
"""
5+
import json
6+
import math
7+
import time
8+
import pandas as pd
9+
import numpy as np
10+
11+
SIZE = 100_000
12+
WARMUP = 5
13+
ITERATIONS = 50
14+
15+
data = np.array([math.sin(i * 0.01) * 100 for i in range(SIZE)])
16+
s = pd.Series(data)
17+
18+
for _ in range(WARMUP):
19+
s.var()
20+
s.sem()
21+
22+
start = time.perf_counter()
23+
for _ in range(ITERATIONS):
24+
s.var()
25+
s.sem()
26+
total = (time.perf_counter() - start) * 1000
27+
28+
print(json.dumps({"function": "sem_var", "mean_ms": total / ITERATIONS, "iterations": ITERATIONS, "total_ms": total}))
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
"""
2+
Benchmark: Series.skew() / Series.kurt() — skewness and kurtosis on a 100k-element Series.
3+
Outputs JSON: {"function": "skew_kurt", "mean_ms": ..., "iterations": ..., "total_ms": ...}
4+
"""
5+
import json
6+
import math
7+
import time
8+
import pandas as pd
9+
import numpy as np
10+
11+
SIZE = 100_000
12+
WARMUP = 5
13+
ITERATIONS = 50
14+
15+
data = np.array([math.sin(i * 0.01) * 100 for i in range(SIZE)])
16+
s = pd.Series(data)
17+
18+
for _ in range(WARMUP):
19+
s.skew()
20+
s.kurt()
21+
22+
start = time.perf_counter()
23+
for _ in range(ITERATIONS):
24+
s.skew()
25+
s.kurt()
26+
total = (time.perf_counter() - start) * 1000
27+
28+
print(json.dumps({"function": "skew_kurt", "mean_ms": total / ITERATIONS, "iterations": ITERATIONS, "total_ms": total}))
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/**
2+
* Benchmark: clipAdvancedSeries / clipAdvancedDataFrame — per-element clipping with array bounds.
3+
* Outputs JSON: {"function": "clip_advanced", "mean_ms": ..., "iterations": ..., "total_ms": ...}
4+
*/
5+
import { Series, DataFrame, clipAdvancedSeries, clipAdvancedDataFrame } from "../../src/index.ts";
6+
7+
const ROWS = 50_000;
8+
const WARMUP = 5;
9+
const ITERATIONS = 30;
10+
11+
const data = Float64Array.from({ length: ROWS }, (_, i) => Math.sin(i * 0.01) * 200);
12+
const lower = Float64Array.from({ length: ROWS }, () => -50);
13+
const upper = Float64Array.from({ length: ROWS }, () => 50);
14+
const s = new Series(data);
15+
const lowerArr = Array.from(lower);
16+
const upperArr = Array.from(upper);
17+
18+
const dfCols: Record<string, number[]> = {};
19+
for (let c = 0; c < 5; c++) {
20+
dfCols[`col${c}`] = Array.from({ length: ROWS }, (_, i) => Math.sin((i + c) * 0.01) * 200);
21+
}
22+
const df = new DataFrame(dfCols);
23+
24+
for (let i = 0; i < WARMUP; i++) {
25+
clipAdvancedSeries(s, { lower: lowerArr, upper: upperArr });
26+
clipAdvancedDataFrame(df, { lower: -50, upper: 50 });
27+
}
28+
29+
const start = performance.now();
30+
for (let i = 0; i < ITERATIONS; i++) {
31+
clipAdvancedSeries(s, { lower: lowerArr, upper: upperArr });
32+
clipAdvancedDataFrame(df, { lower: -50, upper: 50 });
33+
}
34+
const total = performance.now() - start;
35+
36+
console.log(JSON.stringify({ function: "clip_advanced", 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: varDataFrame / semDataFrame — variance and SEM on a 10k×10 DataFrame.
3+
* Outputs JSON: {"function": "dataframe_sem_var", "mean_ms": ..., "iterations": ..., "total_ms": ...}
4+
*/
5+
import { DataFrame, varDataFrame, semDataFrame } from "../../src/index.ts";
6+
7+
const ROWS = 10_000;
8+
const COLS = 10;
9+
const WARMUP = 5;
10+
const ITERATIONS = 20;
11+
12+
const columns: Record<string, number[]> = {};
13+
for (let c = 0; c < COLS; c++) {
14+
columns[`col${c}`] = Array.from({ length: ROWS }, (_, i) => Math.sin((i + c) * 0.01) * 100);
15+
}
16+
const df = new DataFrame(columns);
17+
18+
for (let i = 0; i < WARMUP; i++) {
19+
varDataFrame(df);
20+
semDataFrame(df);
21+
}
22+
23+
const start = performance.now();
24+
for (let i = 0; i < ITERATIONS; i++) {
25+
varDataFrame(df);
26+
semDataFrame(df);
27+
}
28+
const total = performance.now() - start;
29+
30+
console.log(JSON.stringify({ function: "dataframe_sem_var", mean_ms: total / ITERATIONS, iterations: ITERATIONS, total_ms: total }));

0 commit comments

Comments
 (0)