import os import sys import time from glob import glob from pathlib import Path from subprocess import PIPE, STDOUT, run from pytablewriter import MarkdownTableWriter from pytablewriter.style import Style def read_md(): """ Read README.md """ with open("../README.md", "r") as f: md = [line.strip() for line in f.readlines() if line.strip() != ""][1:] return md def write_md(results): """ Write to README.md """ 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, ) os.chdir(wd) return scripts 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[: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, 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[: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]) os.chdir(wd) return julia_problem_numbers, julia_timings, julia_results def execute(combine_columns=True, nproblems=-1): """ Execute scripts and return md formatted table """ 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 ) 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, 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 ) 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(combine_columns=True) # print(res) # write_md(res)