Skip to content

Commit 840a02e

Browse files
authored
Merge pull request #128 from githubnext/autoloop/perf-comparison-12683ddd005469f2
[Autoloop] [Autoloop: perf-comparison]
2 parents 2227d79 + dc71983 commit 840a02e

44 files changed

Lines changed: 1505 additions & 19 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

benchmarks/pandas/bench_concat.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
"""Benchmark: concat — concatenate two 50k-row DataFrames"""
2+
import json, time
3+
import numpy as np
4+
import pandas as pd
5+
6+
ROWS = 50_000
7+
WARMUP = 5
8+
ITERATIONS = 20
9+
10+
vals1 = np.arange(ROWS, dtype=np.float64)
11+
vals2 = np.arange(ROWS, dtype=np.float64) * 2.0
12+
df1 = pd.DataFrame({"value": vals1})
13+
df2 = pd.DataFrame({"value": vals2})
14+
15+
for _ in range(WARMUP):
16+
pd.concat([df1, df2], ignore_index=True)
17+
18+
start = time.perf_counter()
19+
for _ in range(ITERATIONS):
20+
pd.concat([df1, df2], ignore_index=True)
21+
total = (time.perf_counter() - start) * 1000
22+
23+
print(json.dumps({
24+
"function": "concat",
25+
"mean_ms": total / ITERATIONS,
26+
"iterations": ITERATIONS,
27+
"total_ms": total,
28+
}))
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
"""Benchmark: dataframe_apply — apply a function across rows of a 10k-row DataFrame"""
2+
import json, time
3+
import numpy as np
4+
import pandas as pd
5+
6+
ROWS = 10_000
7+
WARMUP = 3
8+
ITERATIONS = 10
9+
10+
a = np.arange(ROWS, dtype=np.float64)
11+
b = np.arange(ROWS, dtype=np.float64) * 2.0
12+
df = pd.DataFrame({"a": a, "b": b})
13+
14+
for _ in range(WARMUP):
15+
df.apply(lambda row: row["a"] + row["b"], axis=1)
16+
17+
start = time.perf_counter()
18+
for _ in range(ITERATIONS):
19+
df.apply(lambda row: row["a"] + row["b"], axis=1)
20+
total = (time.perf_counter() - start) * 1000
21+
22+
print(json.dumps({
23+
"function": "dataframe_apply",
24+
"mean_ms": total / ITERATIONS,
25+
"iterations": ITERATIONS,
26+
"total_ms": total,
27+
}))
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
"""Benchmark: DataFrame creation from arrays (pandas equivalent)"""
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+
nums1 = np.arange(ROWS, dtype=np.float64) * 1.1
11+
nums2 = np.arange(ROWS, dtype=np.float64) * 2.2
12+
strs = [f"label_{i % 100}" for i in range(ROWS)]
13+
14+
for _ in range(WARMUP):
15+
pd.DataFrame({"a": nums1, "b": nums2, "c": strs})
16+
17+
start = time.perf_counter()
18+
for _ in range(ITERATIONS):
19+
pd.DataFrame({"a": nums1, "b": nums2, "c": strs})
20+
total = (time.perf_counter() - start) * 1000
21+
22+
print(json.dumps({
23+
"function": "dataframe_creation",
24+
"mean_ms": total / ITERATIONS,
25+
"iterations": ITERATIONS,
26+
"total_ms": total,
27+
}))
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
"""Benchmark: dataframe_dropna — drop rows with NaN values from 100k-row DataFrame"""
2+
import json, time
3+
import numpy as np
4+
import pandas as pd
5+
6+
ROWS = 100_000
7+
WARMUP = 5
8+
ITERATIONS = 20
9+
10+
a = np.where(np.arange(ROWS) % 10 == 0, np.nan, np.arange(ROWS) * 1.1)
11+
b = np.where(np.arange(ROWS) % 7 == 0, np.nan, np.arange(ROWS) * 2.2)
12+
df = pd.DataFrame({"a": a, "b": b})
13+
14+
for _ in range(WARMUP):
15+
df.dropna()
16+
17+
start = time.perf_counter()
18+
for _ in range(ITERATIONS):
19+
df.dropna()
20+
total = (time.perf_counter() - start) * 1000
21+
22+
print(json.dumps({
23+
"function": "dataframe_dropna",
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: DataFrame filter (boolean mask 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 = 5
8+
ITERATIONS = 20
9+
10+
vals = np.arange(ROWS, dtype=np.float64) * 0.1
11+
df = pd.DataFrame({"value": vals})
12+
13+
for _ in range(WARMUP):
14+
df[df["value"] > 5000]
15+
16+
start = time.perf_counter()
17+
for _ in range(ITERATIONS):
18+
df[df["value"] > 5000]
19+
total = (time.perf_counter() - start) * 1000
20+
21+
print(json.dumps({
22+
"function": "dataframe_filter",
23+
"mean_ms": total / ITERATIONS,
24+
"iterations": ITERATIONS,
25+
"total_ms": total,
26+
}))
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
"""Benchmark: dataframe_rename — rename columns in 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 = 5
8+
ITERATIONS = 20
9+
10+
a = np.arange(ROWS, dtype=np.float64) * 1.1
11+
b = np.arange(ROWS, dtype=np.float64) * 2.2
12+
df = pd.DataFrame({"old_a": a, "old_b": b})
13+
14+
for _ in range(WARMUP):
15+
df.rename(columns={"old_a": "new_a", "old_b": "new_b"})
16+
17+
start = time.perf_counter()
18+
for _ in range(ITERATIONS):
19+
df.rename(columns={"old_a": "new_a", "old_b": "new_b"})
20+
total = (time.perf_counter() - start) * 1000
21+
22+
print(json.dumps({
23+
"function": "dataframe_rename",
24+
"mean_ms": total / ITERATIONS,
25+
"iterations": ITERATIONS,
26+
"total_ms": total,
27+
}))
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
"""Benchmark: dataframe_sort — sort a 100k-row DataFrame by two columns"""
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+
rng = np.random.default_rng(42)
11+
a = [f"group_{i % 100}" for i in range(ROWS)]
12+
b = rng.random(ROWS) * 1000
13+
df = pd.DataFrame({"a": a, "b": b})
14+
15+
for _ in range(WARMUP):
16+
df.sort_values(["a", "b"])
17+
18+
start = time.perf_counter()
19+
for _ in range(ITERATIONS):
20+
df.sort_values(["a", "b"])
21+
total = (time.perf_counter() - start) * 1000
22+
23+
print(json.dumps({
24+
"function": "dataframe_sort",
25+
"mean_ms": total / ITERATIONS,
26+
"iterations": ITERATIONS,
27+
"total_ms": total,
28+
}))
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
"""Benchmark: describe — summary statistics on 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+
a = np.arange(ROWS, dtype=np.float64) * 1.1
11+
b = np.sqrt(np.arange(1, ROWS + 1, dtype=np.float64))
12+
df = pd.DataFrame({"a": a, "b": b})
13+
14+
for _ in range(WARMUP):
15+
df.describe()
16+
17+
start = time.perf_counter()
18+
for _ in range(ITERATIONS):
19+
df.describe()
20+
total = (time.perf_counter() - start) * 1000
21+
22+
print(json.dumps({
23+
"function": "describe",
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: ewm_mean — exponentially weighted mean 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.sin(np.arange(ROWS) * 0.05)
11+
s = pd.Series(data)
12+
13+
for _ in range(WARMUP):
14+
s.ewm(span=20).mean()
15+
16+
start = time.perf_counter()
17+
for _ in range(ITERATIONS):
18+
s.ewm(span=20).mean()
19+
total = (time.perf_counter() - start) * 1000
20+
21+
print(json.dumps({
22+
"function": "ewm_mean",
23+
"mean_ms": total / ITERATIONS,
24+
"iterations": ITERATIONS,
25+
"total_ms": total,
26+
}))
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
"""Benchmark: GroupBy mean 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+
keys = [f"group_{i % 100}" for i in range(ROWS)]
11+
vals = np.arange(ROWS, dtype=np.float64) * 0.1
12+
df = pd.DataFrame({"key": keys, "value": vals})
13+
14+
for _ in range(WARMUP):
15+
df.groupby("key")["value"].mean()
16+
17+
start = time.perf_counter()
18+
for _ in range(ITERATIONS):
19+
df.groupby("key")["value"].mean()
20+
total = (time.perf_counter() - start) * 1000
21+
22+
print(json.dumps({
23+
"function": "groupby_mean",
24+
"mean_ms": total / ITERATIONS,
25+
"iterations": ITERATIONS,
26+
"total_ms": total,
27+
}))

0 commit comments

Comments
 (0)