Skip to content

Commit eda00ab

Browse files
Iteration 266: 10 new benchmark pairs (609 total, +10 vs canonical 599)
Added 10 new benchmark pairs for recently merged functions: - ffill_bfill_series_na: ffillSeries / bfillSeries - ffill_bfill_df_na: dataFrameFfill / dataFrameBfill - diff_shift_df_na: diffDataFrame / shiftDataFrame - interval_range_na: intervalRange - date_range_stats_na: dateRange (stats module) - timedelta_ops_na: toTimedelta / formatTimedelta / parseFrac - date_utils_na: advanceDate / parseFreq / toDateInput - nunique_df_standalone_na: nunique (DataFrame standalone) - any_all_reduce_na: anySeries / allSeries / anyDataFrame / allDataFrame - pct_change_na: pctChangeSeries / pctChangeDataFrame Run: https://github.com/githubnext/tsessebe/actions/runs/24690878721 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 4da5bd5 commit eda00ab

20 files changed

Lines changed: 732 additions & 0 deletions
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
"""
2+
Benchmark: Series.any() / all() / DataFrame.any() / all() — boolean reductions.
3+
Outputs JSON: {"function": "any_all_reduce_na", "mean_ms": ..., "iterations": ..., "total_ms": ...}
4+
"""
5+
import json
6+
import time
7+
import numpy as np
8+
import pandas as pd
9+
10+
SIZE = 100_000
11+
ROWS = 10_000
12+
WARMUP = 5
13+
ITERATIONS = 100
14+
15+
bool_data = np.arange(SIZE) % 3 != 0
16+
s = pd.Series(bool_data)
17+
df = pd.DataFrame({
18+
"a": np.arange(ROWS) % 2 == 0,
19+
"b": np.arange(ROWS) > ROWS // 2,
20+
"c": np.ones(ROWS, dtype=bool),
21+
})
22+
23+
for _ in range(WARMUP):
24+
s.any()
25+
s.all()
26+
df.any()
27+
df.all()
28+
29+
start = time.perf_counter()
30+
for _ in range(ITERATIONS):
31+
s.any()
32+
s.all()
33+
df.any()
34+
df.all()
35+
total = (time.perf_counter() - start) * 1000
36+
37+
print(json.dumps({
38+
"function": "any_all_reduce_na",
39+
"mean_ms": total / ITERATIONS,
40+
"iterations": ITERATIONS,
41+
"total_ms": total,
42+
}))
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
"""
2+
Benchmark: pd.date_range — generate date arrays with various frequencies.
3+
Outputs JSON: {"function": "date_range_stats_na", "mean_ms": ..., "iterations": ..., "total_ms": ...}
4+
"""
5+
import json
6+
import time
7+
import pandas as pd
8+
9+
WARMUP = 5
10+
ITERATIONS = 100
11+
12+
start_ = "2020-01-01"
13+
end_ = "2022-12-31"
14+
15+
for _ in range(WARMUP):
16+
pd.date_range(start=start_, end=end_, freq="D")
17+
pd.date_range(start=start_, periods=365, freq="D")
18+
19+
start = time.perf_counter()
20+
for _ in range(ITERATIONS):
21+
pd.date_range(start=start_, end=end_, freq="D")
22+
pd.date_range(start=start_, periods=365, freq="D")
23+
total = (time.perf_counter() - start) * 1000
24+
25+
print(json.dumps({
26+
"function": "date_range_stats_na",
27+
"mean_ms": total / ITERATIONS,
28+
"iterations": ITERATIONS,
29+
"total_ms": total,
30+
}))
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
"""
2+
Benchmark: date parsing utilities — equivalent to advanceDate / parseFreq / toDateInput.
3+
Outputs JSON: {"function": "date_utils_na", "mean_ms": ..., "iterations": ..., "total_ms": ...}
4+
"""
5+
import json
6+
import time
7+
import pandas as pd
8+
from datetime import datetime
9+
10+
WARMUP = 5
11+
ITERATIONS = 200
12+
13+
d = pd.Timestamp("2023-06-15")
14+
15+
for _ in range(WARMUP):
16+
pd.tseries.frequencies.to_offset("D")
17+
pd.tseries.frequencies.to_offset("MS")
18+
d + pd.tseries.frequencies.to_offset("D")
19+
d + pd.tseries.frequencies.to_offset("MS")
20+
d + pd.tseries.frequencies.to_offset("QS")
21+
pd.Timestamp("2023-06-15")
22+
pd.Timestamp(1686787200000, unit="ms")
23+
24+
start = time.perf_counter()
25+
for _ in range(ITERATIONS):
26+
pd.tseries.frequencies.to_offset("D")
27+
pd.tseries.frequencies.to_offset("MS")
28+
d + pd.tseries.frequencies.to_offset("D")
29+
d + pd.tseries.frequencies.to_offset("MS")
30+
d + pd.tseries.frequencies.to_offset("QS")
31+
pd.Timestamp("2023-06-15")
32+
pd.Timestamp(1686787200000, unit="ms")
33+
total = (time.perf_counter() - start) * 1000
34+
35+
print(json.dumps({
36+
"function": "date_utils_na",
37+
"mean_ms": total / ITERATIONS,
38+
"iterations": ITERATIONS,
39+
"total_ms": total,
40+
}))
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
"""
2+
Benchmark: DataFrame.diff() / shift() — diff and shift on 10k-row DataFrame.
3+
Outputs JSON: {"function": "diff_shift_df_na", "mean_ms": ..., "iterations": ..., "total_ms": ...}
4+
"""
5+
import json
6+
import time
7+
import numpy as np
8+
import pandas as pd
9+
10+
ROWS = 10_000
11+
WARMUP = 5
12+
ITERATIONS = 50
13+
14+
df = pd.DataFrame({
15+
"a": np.arange(ROWS) * 2.0,
16+
"b": np.arange(ROWS) * 3.0,
17+
"c": np.arange(ROWS) * 0.5,
18+
})
19+
20+
for _ in range(WARMUP):
21+
df.diff(periods=1)
22+
df.shift(periods=2)
23+
24+
start = time.perf_counter()
25+
for _ in range(ITERATIONS):
26+
df.diff(periods=1)
27+
df.shift(periods=2)
28+
total = (time.perf_counter() - start) * 1000
29+
30+
print(json.dumps({
31+
"function": "diff_shift_df_na",
32+
"mean_ms": total / ITERATIONS,
33+
"iterations": ITERATIONS,
34+
"total_ms": total,
35+
}))
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
"""
2+
Benchmark: DataFrame.ffill() / bfill() — forward/backward fill on 10k-row DataFrame.
3+
Outputs JSON: {"function": "ffill_bfill_df_na", "mean_ms": ..., "iterations": ..., "total_ms": ...}
4+
"""
5+
import json
6+
import time
7+
import numpy as np
8+
import pandas as pd
9+
10+
ROWS = 10_000
11+
WARMUP = 5
12+
ITERATIONS = 50
13+
14+
data = {}
15+
for col, offset in zip("abcde", range(5)):
16+
arr = np.arange(ROWS, dtype=float) + offset
17+
arr[::10] = np.nan
18+
data[col] = arr
19+
df = pd.DataFrame(data)
20+
21+
for _ in range(WARMUP):
22+
df.ffill()
23+
df.bfill()
24+
25+
start = time.perf_counter()
26+
for _ in range(ITERATIONS):
27+
df.ffill()
28+
df.bfill()
29+
total = (time.perf_counter() - start) * 1000
30+
31+
print(json.dumps({
32+
"function": "ffill_bfill_df_na",
33+
"mean_ms": total / ITERATIONS,
34+
"iterations": ITERATIONS,
35+
"total_ms": total,
36+
}))
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
"""
2+
Benchmark: Series.ffill() / bfill() — forward/backward fill on 100k-element Series.
3+
Outputs JSON: {"function": "ffill_bfill_series_na", "mean_ms": ..., "iterations": ..., "total_ms": ...}
4+
"""
5+
import json
6+
import time
7+
import numpy as np
8+
import pandas as pd
9+
10+
SIZE = 100_000
11+
WARMUP = 5
12+
ITERATIONS = 50
13+
14+
data = np.arange(SIZE, dtype=float) * 1.5
15+
data[::10] = np.nan
16+
s = pd.Series(data)
17+
18+
for _ in range(WARMUP):
19+
s.ffill()
20+
s.bfill()
21+
22+
start = time.perf_counter()
23+
for _ in range(ITERATIONS):
24+
s.ffill()
25+
s.bfill()
26+
total = (time.perf_counter() - start) * 1000
27+
28+
print(json.dumps({
29+
"function": "ffill_bfill_series_na",
30+
"mean_ms": total / ITERATIONS,
31+
"iterations": ITERATIONS,
32+
"total_ms": total,
33+
}))
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
"""
2+
Benchmark: pd.interval_range — generate numeric IntervalIndex ranges.
3+
Outputs JSON: {"function": "interval_range_na", "mean_ms": ..., "iterations": ..., "total_ms": ...}
4+
"""
5+
import json
6+
import time
7+
import pandas as pd
8+
9+
WARMUP = 5
10+
ITERATIONS = 100
11+
12+
for _ in range(WARMUP):
13+
pd.interval_range(start=0, end=1000, periods=100)
14+
pd.interval_range(start=0, periods=500, freq=2)
15+
16+
start = time.perf_counter()
17+
for _ in range(ITERATIONS):
18+
pd.interval_range(start=0, end=1000, periods=100)
19+
pd.interval_range(start=0, periods=500, freq=2)
20+
total = (time.perf_counter() - start) * 1000
21+
22+
print(json.dumps({
23+
"function": "interval_range_na",
24+
"mean_ms": total / ITERATIONS,
25+
"iterations": ITERATIONS,
26+
"total_ms": total,
27+
}))
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
"""
2+
Benchmark: DataFrame.nunique() — count unique values per column.
3+
Outputs JSON: {"function": "nunique_df_standalone_na", "mean_ms": ..., "iterations": ..., "total_ms": ...}
4+
"""
5+
import json
6+
import time
7+
import numpy as np
8+
import pandas as pd
9+
10+
ROWS = 10_000
11+
WARMUP = 5
12+
ITERATIONS = 100
13+
14+
df = pd.DataFrame({
15+
"a": np.arange(ROWS) % 100,
16+
"b": np.arange(ROWS) % 50,
17+
"c": np.arange(ROWS) % 200,
18+
"d": [None if i % 10 == 0 else i % 75 for i in range(ROWS)],
19+
"e": np.arange(ROWS) % 500,
20+
})
21+
22+
for _ in range(WARMUP):
23+
df.nunique()
24+
df.nunique(axis=0)
25+
26+
start = time.perf_counter()
27+
for _ in range(ITERATIONS):
28+
df.nunique()
29+
df.nunique(axis=0)
30+
total = (time.perf_counter() - start) * 1000
31+
32+
print(json.dumps({
33+
"function": "nunique_df_standalone_na",
34+
"mean_ms": total / ITERATIONS,
35+
"iterations": ITERATIONS,
36+
"total_ms": total,
37+
}))
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
"""
2+
Benchmark: Series.pct_change() / DataFrame.pct_change() — percent change computations.
3+
Outputs JSON: {"function": "pct_change_na", "mean_ms": ..., "iterations": ..., "total_ms": ...}
4+
"""
5+
import json
6+
import time
7+
import numpy as np
8+
import pandas as pd
9+
10+
SIZE = 100_000
11+
ROWS = 10_000
12+
WARMUP = 5
13+
ITERATIONS = 50
14+
15+
s = pd.Series(100 + np.sin(np.arange(SIZE) / 100))
16+
df = pd.DataFrame({
17+
"price": 100 + np.arange(ROWS) * 0.01,
18+
"volume": 1000 + (np.arange(ROWS) % 100) * 10,
19+
"ratio": 0.5 + np.cos(np.arange(ROWS) / 1000),
20+
})
21+
22+
for _ in range(WARMUP):
23+
s.pct_change()
24+
s.pct_change(periods=5)
25+
df.pct_change()
26+
27+
start = time.perf_counter()
28+
for _ in range(ITERATIONS):
29+
s.pct_change()
30+
s.pct_change(periods=5)
31+
df.pct_change()
32+
total = (time.perf_counter() - start) * 1000
33+
34+
print(json.dumps({
35+
"function": "pct_change_na",
36+
"mean_ms": total / ITERATIONS,
37+
"iterations": ITERATIONS,
38+
"total_ms": total,
39+
}))
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
"""
2+
Benchmark: pd.Timedelta parsing / formatting — timedelta ops.
3+
Outputs JSON: {"function": "timedelta_ops_na", "mean_ms": ..., "iterations": ..., "total_ms": ...}
4+
"""
5+
import json
6+
import time
7+
import pandas as pd
8+
9+
WARMUP = 5
10+
ITERATIONS = 100
11+
12+
td = pd.Timedelta(hours=1, minutes=1, seconds=1)
13+
vals = ["1h", "30min", "2.5s", "100ms", "1D 2h"]
14+
15+
for _ in range(WARMUP):
16+
for v in vals:
17+
pd.Timedelta(v)
18+
str(td)
19+
20+
start = time.perf_counter()
21+
for _ in range(ITERATIONS):
22+
for v in vals:
23+
pd.Timedelta(v)
24+
str(td)
25+
total = (time.perf_counter() - start) * 1000
26+
27+
print(json.dumps({
28+
"function": "timedelta_ops_na",
29+
"mean_ms": total / ITERATIONS,
30+
"iterations": ITERATIONS,
31+
"total_ms": total,
32+
}))

0 commit comments

Comments
 (0)