diff --git a/src/update_results_table.py b/src/update_results_table.py index ff3a9f5..b4ca6b3 100644 --- a/src/update_results_table.py +++ b/src/update_results_table.py @@ -17,6 +17,7 @@ def read_md(): md = [line.strip() for line in f.readlines() if line.strip() != ""][1:] return md + def write_md(results): """ Write to README.md @@ -24,36 +25,49 @@ def write_md(results): with open("../dummy.md", "w") as f: f.write(results) + def _file_stem(f): return f[-5:] + def get_problems(path=None, ext=None): wd = os.getcwd() os.chdir(Path(path)) - scripts = sorted([script.as_posix() for script in Path(".").rglob(f"*[0-9].{ext}")], key=_file_stem) + scripts = sorted( + [script.as_posix() for script in Path(".").rglob(f"*[0-9].{ext}")], + key=_file_stem, + ) os.chdir(wd) return scripts -def timing_Python(path=None): + +def timing_Python(path=None, exec_only=1): wd = os.getcwd() scripts = get_problems(path=path, ext="py") os.chdir(Path(path)) python_timings, python_results = [], [] - for script in scripts[:5]: - _res = run(["python3", f"{script}"], capture_output=True, text=True).stdout.split("\n") + for script in scripts[:exec_only]: + print(f"Executing {script}") + _res = run( + ["python3", f"{script}"], capture_output=True, text=True + ).stdout.split("\n") python_timings.append(_res[0]) python_results.append(_res[2]) os.chdir(wd) return python_timings, python_results -def timing_Julia(path=None): + +def timing_Julia(path=None, exec_only=1): wd = os.getcwd() scripts = get_problems(path="Julia", ext="jl") os.chdir(Path(path)) julia_problem_numbers, julia_timings, julia_results = [], [], [] - for script in scripts[:5]: - _res = run(["julia", f"{script}"], capture_output=True, text=True).stdout.split("\n") + for script in scripts[:exec_only]: + print(f"Executing {script}") + _res = run(["julia", f"{script}"], capture_output=True, text=True).stdout.split( + "\n" + ) julia_problem_numbers.append(_res[0]) julia_timings.append(_res[1].split("(")[0]) julia_results.append(_res[3]) @@ -61,42 +75,92 @@ def timing_Julia(path=None): os.chdir(wd) return julia_problem_numbers, julia_timings, julia_results -def execute(): + +def execute(combine_columns=True, nproblems=-1): """ Execute scripts and return md formatted table """ - python_timings, python_results = timing_Python(path="Python") - julia_problem_numbers, julia_timings, julia_results = timing_Julia(path="Julia") + python_timings, python_results = timing_Python(path="Python", exec_only=nproblems) + julia_n_problem, julia_timings, julia_results = timing_Julia( + path="Julia", exec_only=nproblems + ) - for lang in ["Python", "Julia"]: - if lang == "Python": - headers=["Problem #", "Result", "Execution time (Python)"] - value_matrix=[[f"{int(t[25:28]):03d}", int(r[22:]), t[29:]] for t,r in zip(python_timings, python_results)] - elif lang == "Julia": - headers=["Problem #", "Result", "Execution time (Julia)"] - value_matrix=[[f"{int(p[-5:-1]):03d}", int(r[23:]), t] for p,t,r in zip(julia_problem_numbers, julia_timings, julia_results)] - print(f"Printing for {lang}") - writer = MarkdownTableWriter( + assert len(python_timings) == len(julia_timings) + + for i, (pr, jr) in enumerate(zip(python_results, julia_results), start=1): + try: + assert int(pr[22:]) == int(jr[23:]) + except ValueError: + print(f"Results for problem {i} are not identical!\n") + continue + + if combine_columns: + headers = [ + "Problem #", + "Result", + "T_exec (Python)", + "T_exec (Julia)", + ] + value_matrix = [ + [f"{int(t_python[25:28]):03d}", int(r_python[22:]), t_python[29:], t_julia] + for t_python, r_python, t_julia in zip( + python_timings, python_results, julia_timings + ) + ] + writer_comb = MarkdownTableWriter( table_name="Project Euler Solutions", - headers=headers, #["Problem #", "Result", f"Execution time ({lang})"], - value_matrix=value_matrix, #[[f"{int(t[25:28]):03d}", int(r[22:]), t[29:]] for t,r in zip(python_timings, python_results)], - # headers=["Problem #", "Result", "Execution time (Julia)"], - # value_matrix=[[f"{int(p[-5:-1]):03d}", int(r[23:]), t] for p,t,r in zip(julia_problem_numbers, julia_timings, julia_results)], + headers=headers, + value_matrix=value_matrix, column_styles=[ Style(align="center"), Style(align="right", thousand_separator="_"), Style(align="right"), + Style(align="right"), ], # specify styles for each column - margin=1 # add a whitespace for both sides of each cell + margin=1, # add a whitespace for both sides of each cell ) - writer.write_table() - print(writer.dumps()) - # return writer.dumps() + writer_comb.write_table() + writer_comb.write_null_line() + + else: + languages = ["Python", "Julia"] + + for lang in languages: + if lang == "Python": + headers = ["Problem #", "Result", "T_exec (Python)"] + value_matrix = [ + [f"{int(t_python[25:28]):03d}", int(r_python[22:]), t_python[29:]] + for t_python, r_python in zip(python_timings, python_results) + ] + elif lang == "Julia": + headers = ["Problem #", "Result", "T_exec (Julia)"] + value_matrix = [ + [f"{int(p_julia[-5:-1]):03d}", int(r_julia[23:]), t_julia] + for p_julia, r_julia, t_julia in zip( + julia_n_problem, julia_results, julia_timings + ) + ] + + writer = MarkdownTableWriter( + table_name=f"Project Euler Solutions for {lang}", + headers=headers, + value_matrix=value_matrix, + column_styles=[ + Style(align="center"), + Style(align="right", thousand_separator="_"), + Style(align="right"), + ], # specify styles for each column + margin=1, # add a whitespace for both sides of each cell + ) + writer.write_table() + writer.write_null_line() + # print(writer.dumps()) + # return writer.dumps() if __name__ == "__main__": md = read_md() # print(md) - res = execute() + res = execute(combine_columns=True) # print(res) # write_md(res)