Skip to content

Commit b252750

Browse files
authored
Merge pull request #155 from githubnext/autoloop/perf-comparison-36d7559a
[Autoloop] [Autoloop: perf-comparison]
2 parents cab329d + eda00ab commit b252750

64 files changed

Lines changed: 2626 additions & 0 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
"""
2+
Benchmark: pandas DateOffset arithmetic — date frequency parsing and advancement.
3+
Mirrors tsb advanceDate / parseFreq.
4+
Outputs JSON: {"function": "advance_date_fn", "mean_ms": ..., "iterations": ..., "total_ms": ...}
5+
"""
6+
import json
7+
import time
8+
import pandas as pd
9+
10+
WARMUP = 5
11+
ITERATIONS = 1000
12+
13+
d = pd.Timestamp("2023-06-15")
14+
offsets = [
15+
pd.DateOffset(days=1),
16+
pd.DateOffset(days=3),
17+
pd.offsets.BDay(1),
18+
pd.offsets.Week(1),
19+
pd.offsets.MonthBegin(1),
20+
pd.offsets.MonthEnd(1),
21+
pd.DateOffset(hours=1),
22+
pd.DateOffset(hours=2),
23+
pd.DateOffset(minutes=1),
24+
pd.offsets.YearBegin(1),
25+
]
26+
27+
for _ in range(WARMUP):
28+
for off in offsets:
29+
d + off
30+
pd.Timestamp("2023-01-01")
31+
pd.Timestamp(1672531200000, unit="ms")
32+
33+
t0 = time.perf_counter()
34+
for _ in range(ITERATIONS):
35+
for off in offsets:
36+
d + off
37+
pd.Timestamp("2023-01-01")
38+
pd.Timestamp(1672531200000, unit="ms")
39+
total = (time.perf_counter() - t0) * 1000
40+
41+
print(json.dumps({
42+
"function": "advance_date_fn",
43+
"mean_ms": round(total / ITERATIONS, 3),
44+
"iterations": ITERATIONS,
45+
"total_ms": round(total, 3),
46+
}))
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: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
"""
2+
Benchmark: pandas DataFrame.diff() / DataFrame.shift() — discrete difference and shift.
3+
Outputs JSON: {"function": "dataframe_diff_shift_fn", "mean_ms": ..., "iterations": ..., "total_ms": ...}
4+
"""
5+
import json
6+
import time
7+
import pandas as pd
8+
import numpy as np
9+
10+
SIZE = 100_000
11+
WARMUP = 5
12+
ITERATIONS = 20
13+
14+
df = pd.DataFrame({
15+
"a": np.arange(SIZE, dtype=float),
16+
"b": np.sin(np.arange(SIZE) * 0.01) * 100,
17+
"c": np.arange(SIZE) * 2.5,
18+
})
19+
20+
for _ in range(WARMUP):
21+
df.diff()
22+
df.diff(periods=3)
23+
df.shift(1)
24+
df.shift(-2)
25+
26+
start = time.perf_counter()
27+
for _ in range(ITERATIONS):
28+
df.diff()
29+
df.diff(periods=3)
30+
df.shift(1)
31+
df.shift(-2)
32+
total = (time.perf_counter() - start) * 1000
33+
34+
print(json.dumps({
35+
"function": "dataframe_diff_shift_fn",
36+
"mean_ms": round(total / ITERATIONS, 3),
37+
"iterations": ITERATIONS,
38+
"total_ms": round(total, 3),
39+
}))
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
"""
2+
Benchmark: pandas DataFrame.ffill() / DataFrame.bfill() — forward/backward fill.
3+
Outputs JSON: {"function": "dataframe_ffill_bfill_fn", "mean_ms": ..., "iterations": ..., "total_ms": ...}
4+
"""
5+
import json
6+
import time
7+
import pandas as pd
8+
import numpy as np
9+
10+
SIZE = 100_000
11+
WARMUP = 5
12+
ITERATIONS = 20
13+
14+
df = pd.DataFrame({
15+
"a": [float("nan") if i % 5 == 0 else i * 0.1 for i in range(SIZE)],
16+
"b": [float("nan") if i % 7 == 0 else i * 2.0 for i in range(SIZE)],
17+
"c": [float("nan") if i % 3 == 0 else i * 0.5 for i in range(SIZE)],
18+
})
19+
20+
for _ in range(WARMUP):
21+
df.ffill()
22+
df.bfill()
23+
df.ffill(limit=3)
24+
25+
start = time.perf_counter()
26+
for _ in range(ITERATIONS):
27+
df.ffill()
28+
df.bfill()
29+
df.ffill(limit=3)
30+
total = (time.perf_counter() - start) * 1000
31+
32+
print(json.dumps({
33+
"function": "dataframe_ffill_bfill_fn",
34+
"mean_ms": round(total / ITERATIONS, 3),
35+
"iterations": ITERATIONS,
36+
"total_ms": round(total, 3),
37+
}))
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
"""
2+
Benchmark: pandas.date_range() — generate a fixed-frequency date sequence.
3+
Outputs JSON: {"function": "date_range_fn", "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+
pd.date_range(start=start, periods=24, freq="h")
19+
20+
t0 = time.perf_counter()
21+
for _ in range(ITERATIONS):
22+
pd.date_range(start=start, end=end, freq="D")
23+
pd.date_range(start=start, periods=365, freq="D")
24+
pd.date_range(start=start, periods=24, freq="h")
25+
total = (time.perf_counter() - t0) * 1000
26+
27+
print(json.dumps({
28+
"function": "date_range_fn",
29+
"mean_ms": round(total / ITERATIONS, 3),
30+
"iterations": ITERATIONS,
31+
"total_ms": round(total, 3),
32+
}))
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+
}))

0 commit comments

Comments
 (0)