Finding the arithmetic mean (average) is one of the most common operations in programming. Python offers several approaches depending on your needs: built-in functions for simplicity, the statistics module for correctness, and NumPy for performance.
Using Built-in sum() and len()
For standard lists, combining sum() and len() is the most straightforward native approach.
prices = [19.99, 5.50, 4.25, 10.00]
average = sum(prices) / len(prices)
print(f"Average Price: ${average:.2f}")Output:
Average Price: $9.93Using a Conditional Expression
prices = [19.99, 5.50, 4.25, 10.00]
average = sum(prices) / len(prices) if prices else 0.0
print(f"Average: {average:.2f}") # Output: Average: 9.93Using the statistics Module
Python's standard library includes a statistics module specifically designed for statistical calculations. It handles edge cases and provides clear, readable code.
import statistics
data = [1.5, 2.5, 3.5, 4.5, 5.5]
average = statistics.mean(data)
print(f"Mean: {average}")Output:
Mean: 3.5Additional Statistical Functions
The statistics module offers more than just the mean:
import statistics
data = [2.5, 3.0, 3.5, 4.0, 4.5, 100.0] # Note the outlier
print(f"Mean: {statistics.mean(data):.2f}")
print(f"Median: {statistics.median(data):.2f}")
print(f"Stdev: {statistics.stdev(data):.2f}")Output:
Mean: 19.58
Median: 3.75
Stdev: 39.40Using NumPy for Large Datasets
For lists with millions of elements, standard Python becomes slow. NumPy is written in C and optimized for numerical operations.
import numpy as np
data = np.array([1.1, 2.2, 3.3, 4.4, 5.5])
average = np.mean(data)
print(f"Average: {average}")Output:
Average: 3.3Working with Large Datasets
import numpy as np
large_dataset = np.random.uniform(0, 100, size=1_000_000)
average = np.mean(large_dataset)
print(f"Average of 1M values: {average:.4f}")Output:
Average of 1M values: 49.9872NumPy with Multi-dimensional Data
import numpy as np
sales = np.array([
[100.5, 200.3, 150.2],
[110.2, 190.5, 160.8],
[105.8, 210.1, 155.5]
])
total_avg = np.mean(sales)
product_avg = np.mean(sales, axis=0)
monthly_avg = np.mean(sales, axis=1)
print(f"Overall average: {total_avg:.2f}")
print(f"Per product: {product_avg}")
print(f"Per month: {monthly_avg}")Output:
Overall average: 153.77
Per product: [105.5 200.3 155.5]
Per month: [150.33333333 153.83333333 157.13333333]Performance Comparison
import time
import statistics
import numpy as np
data_list = [float(i) for i in range(1_000_000)]
data_array = np.array(data_list)
def benchmark(name, func):
start = time.perf_counter()
result = func()
elapsed = time.perf_counter() - start
print(f"{name}: {elapsed:.4f}s (result: {result:.2f})")
benchmark("sum/len", lambda: sum(data_list) / len(data_list))
benchmark("statistics.mean", lambda: statistics.mean(data_list))
benchmark("numpy.mean", lambda: np.mean(data_array))Typical Output:
sum/len: 0.0080s (result: 499999.50)
statistics.mean: 0.3006s (result: 499999.50)
numpy.mean: 0.0007s (result: 499999.50)Handling Special Cases
Filtering Before Averaging
import statistics
scores = [85.5, 90.0, None, 78.5, None, 92.0]
valid_scores = [s for s in scores if s is not None]
if valid_scores:
average = statistics.mean(valid_scores)
print(f"Average score: {average:.1f}")Output:
Average score: 86.5Weighted Average
def weighted_average(values: list[float], weights: list[float]) -> float:
"""Calculate weighted average."""
if len(values) != len(weights):
raise ValueError("Values and weights must have same length")
total = sum(v * w for v, w in zip(values, weights))
return total / sum(weights)
grades = [85.0, 90.0, 78.0]
weights = [0.3, 0.5, 0.2] # 30%, 50%, 20%
result = weighted_average(grades, weights)
print(f"Weighted average: {result:.1f}")Output:
Weighted average: 86.1Method Comparison
| Method | Speed | Dependencies | Best For |
|---|---|---|---|
sum()/len() |
Fast | None | Simple scripts, small data |
statistics.mean() |
Moderate | None (stdlib) | Readability, additional stats |
numpy.mean() |
Ultra Fast | NumPy | Large datasets, data science |
Summary
- Use
sum()/len()for simple cases with small lists: just remember to check for empty lists. - Use
statistics.mean()when readability matters or you need additional statistical functions. - Use
numpy.mean()for large datasets or when already working in a data science context.