Created
August 8, 2024 06:31
-
-
Save manish/6d759d731c7fe4b251a091fc562fca12 to your computer and use it in GitHub Desktop.
timeit.repeat experiments
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import timeit | |
import matplotlib.pyplot as plt | |
import json | |
import os | |
import statistics | |
import numpy as np | |
def run_experiment(number_of_repeats, number_of_runs=1000): | |
execution_time = timeit.repeat( | |
"from functools import reduce; reduce((lambda x, y: x * y), range(1, 2000))", | |
repeat=number_of_repeats, | |
number=number_of_runs | |
) | |
return execution_time | |
def save_result(result, repeats): | |
filename = f'execution_time_results_{repeats}.json' | |
with open(filename, 'w') as f: | |
json.dump(result, f) | |
def load_result(repeats): | |
filename = f'execution_time_results_{repeats}.json' | |
if os.path.exists(filename): | |
with open(filename, 'r') as f: | |
return json.load(f) | |
return None | |
def truncated_mean(data, percentile=95): | |
data = np.array(data) | |
lower_bound = np.percentile(data, (100 - percentile) / 2) | |
upper_bound = np.percentile(data, 100 - (100 - percentile) / 2) | |
return np.mean(data[(data >= lower_bound) & (data <= upper_bound)]) | |
# List of number_of_repeats to test | |
repeat_values = [5, 20, 100, 500, 1000, 3000] | |
# Run experiments and collect results | |
results = [] | |
for repeats in repeat_values: | |
result = load_result(repeats) | |
if result is None: | |
print(f"Running experiment for {repeats} repeats...") | |
try: | |
result = run_experiment(repeats) | |
save_result(result, repeats) | |
print(f"Experiment for {repeats} repeats completed and saved.") | |
except KeyboardInterrupt: | |
print(f"\nExperiment for {repeats} repeats interrupted.") | |
continue | |
else: | |
print(f"Loaded existing results for {repeats} repeats.") | |
# Print time taken per repetition | |
avg_time = statistics.mean(result) | |
print(f"Average time per repetition for {repeats} repeats: {avg_time:.6f} seconds") | |
results.append(result) | |
trunc_means = [truncated_mean(r) for r in results] | |
medians = [np.median(r) for r in results] | |
mins = [np.min(r) for r in results] | |
maxs = [np.max(r) for r in results] | |
# Create subplots | |
fig, axs = plt.subplots(2, 2, figsize=(15, 12)) | |
fig.suptitle('Execution Time Analysis for Different Number of Repeats', fontsize=16) | |
metrics = [ | |
('Truncated Mean (95%)', trunc_means), | |
('Median', medians), | |
('Min', mins), | |
('Max', maxs) | |
] | |
for (title, data), ax in zip(metrics, axs.flatten()): | |
ax.plot(repeat_values, data, marker='o') | |
ax.set_title(title) | |
ax.set_xlabel('Number of Repeats') | |
ax.set_ylabel('Execution Time (seconds)') | |
ax.set_xscale('log') | |
ax.grid(True, which="both", ls="-", alpha=0.2) | |
# Set x-ticks and labels for each data point | |
ax.set_xticks(repeat_values) | |
ax.set_xticklabels(repeat_values) | |
# Rotate x-axis labels for better readability | |
ax.tick_params(axis='x', rotation=45) | |
plt.tight_layout() | |
# Save the plot to a file | |
plt.savefig('execution_time_analysis.png', dpi=300, bbox_inches='tight') | |
print("Plot saved as 'execution_time_analysis.png'") | |
# Create histograms for data distribution with 10 bins | |
fig, axs = plt.subplots(2, 3, figsize=(20, 12)) | |
fig.suptitle('Data Distribution Histograms for Different Number of Repeats (10 bins)', fontsize=16) | |
for repeat, result, ax in zip(repeat_values, results, axs.flatten()): | |
ax.hist(result, bins=10, edgecolor='black') | |
ax.set_title(f'Repeats: {repeat}') | |
ax.set_xlabel('Execution Time (seconds)') | |
ax.set_ylabel('Frequency') | |
plt.tight_layout() | |
# Save the histograms to a file | |
plt.savefig('data_distribution_histograms_10bins.png', dpi=300, bbox_inches='tight') | |
print("Histograms saved as 'data_distribution_histograms_10bins.png'") | |
# Create histograms for 1000 and 3000 repeats with 30 bins | |
fig, axs = plt.subplots(1, 2, figsize=(15, 6)) | |
fig.suptitle('Data Distribution Histograms for 1000 and 3000 Repeats (30 bins)', fontsize=16) | |
for repeat, result, ax in zip([1000, 3000], results[-2:], axs): | |
ax.hist(result, bins=100, edgecolor='black') | |
ax.set_title(f'Repeats: {repeat}') | |
ax.set_xlabel('Execution Time (seconds)') | |
ax.set_ylabel('Frequency') | |
plt.tight_layout() | |
# Save the detailed histograms to a file | |
plt.savefig('data_distribution_histograms_detailed.png', dpi=300, bbox_inches='tight') | |
print("Detailed histograms saved as 'data_distribution_histograms_detailed.png'") | |
plt.show() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment