-------------------------------------------------------------------------------------- Verze kódu: git commit 526bbff1667b08aec0aca88b3173529281ae9d0d Python: 3.12.3 OS/jádro: Linux 14~24.04.1-Ubuntu 6.17.0-14-generic CPU: AMD Ryzen 7 5700U with Radeon Graphics Úložiště: NVMe SSD, ext4 Závislosti: mathlib.py, profiling.py, error.py Nástroje: cProfile (vestavěný v Pythonu 3.12.3), snakeviz 2.2.2 Tvorba testovacích vstupů: python3 generate_inputs.py Spuštění: python3 -m cProfile -o profile.stats profiling.py < Zpracování výsledků: snakeviz profile.stats nebo python3 print_stats_precise.py profile.stats -------------------------------------------------------------------------------------- Vstup o velikosti 10 čiselných hodnot Program tráví nejvíce času importem knihovní funkce :1349(_find_and_load) (0.00146 s) Pokud je nebudeme započítávat, pak program tráví nejvíce času (0.000134 s) ve funkci calculate_sample_stddev -------------------------------------------------------------------------------------- Vstup o velikosti 10^3 čiselných hodnot Program tráví nejvíce času (0.004305 s) ve funkci calculate_sample_stddev -------------------------------------------------------------------------------------- Vstup o velikosti 10^6 čiselných hodnot Program tráví nejvíce času (3.99 s) ve funkci calculate_sample_stddev Nejlépe se zaměřit v každém případě na optimizaci algoritmu výpočítání směrodatné odchýlky -------------------------------------------------------------------------------------- #print_stats_precise.py import pstats import sys p = pstats.Stats(sys.argv[1]) p.strip_dirs() p.sort_stats("tottime") print(f"{'tottime':>12} {'cumtime':>12} {'ncalls':>8} {'percall':>12} function") print("-" * 80) for func, (cc, nc, tt, ct, _) in p.stats.items(): percall = tt / nc if nc > 0 else 0.0 print(f"{tt:12.6f} {ct:12.6f} {nc:8} {percall:12.6f} {func}") -------------------------------------------------------------------------------------- #generate_inputs.py import os import random def write_numbers(path: str, n: int, seed: int = 12345): rnd = random.Random(seed) os.makedirs(os.path.dirname(path), exist_ok=True) with open(path, "w", encoding="utf-8") as f: per_line = 10 for i in range(n): x = rnd.uniform(-50000.0, 50000.0) f.write(f"{x}") if (i + 1) % per_line == 0: f.write("\n") else: f.write(" ") def main(): write_numbers("profiling/input_10.txt", 10) write_numbers("profiling/input_1e3.txt", 1_000) write_numbers("profiling/input_1e6.txt", 1_000_000) if __name__ == "__main__": main() --------------------------------------------------------------------------------------