Python(stringをまとめて九九表表示)

前回投稿Python(フォーマットを意識した九九表示)でstringをまとめたら実行速度が速くなるはずということに触れたので、実際にまとめて表示できるプログラムを作成し、時間を計測してみました。
ついでにmodeをキーワード引数にもち、表の一行目(カラム)と左の一列目(インデックス)の表示ONOFF機能も追加しています。

# table作成show関数
def time_log(func):
    """処理時間を計測するデコレータ関数"""
    def wrapper(*args,**kwargs):
        import datetime
        start = datetime.datetime.today()
        print("\n---start:" + func.__name__)
        res = func(*args,**kwargs)
        end = datetime.datetime.today()
        delta = end - start
        print("\n---end:" + func.__name__,delta,"sec")
        return res
    return wrapper

@time_log
def show(first=1,end=9,*,mode=0):
    r=range(first,end+1)
    column=[i for i in r]
    table=[[i*j for i in r] for j in r]
    ps=[len(str(x)) for x in table[-1]]
    left=len(str(table[-1][0]))
    str_line=""
    str_table_list=["|".join(line)
                    for line in [["%*d"%v for v in zip(ps,table[n])]
                                 for n in range(len(column))]]
    
    str_column=" "*left + "  "
    for x in zip(ps,column):
        str_column = str_column + "%*d"%x + " "        

    if mode == 0:
        str_line=" "*left + " "
    str_line = str_line + "+"
    for i in ps:
        str_line = str_line + "-"*i + "+"        
    
    # 1段目
    if mode == 0:
        print(str_column)
    
    # 2段目以降
    for n in range(len(column)):
        print(str_line)
        if mode == 0:
            print("%*d"%(left,column[n]),end=" ")        
        print("|" + str_table_list[n] + "|")
    print(str_line)

show()
#show(5)
#show(4,10)
show(mode=1)
#show(10,15,mode=1)

リスト内包表記を活用してstr_table_listという九九の1段ずつをstringでまとめたリストを作成して表示するようにしました。(リスト内包表記で複雑な操作をすると一行が長くなるので改行しています。forループでも同様の操作ができます。)
さらに表全部をstringで登録して表示したら、もっと速くなるはずって事で、 stringを全部まとめたプログラムも作成。

def show(first=1,end=9,*,mode=0):
    r=range(first,end+1)
    column=[i for i in r]
    table=[[i*j for i in r] for j in r]
    ps=[len(str(x)) for x in table[-1]]
    left=len(str(table[-1][0]))
    str_line=""
    str_table=""
    str_table_list=["|".join(line)
                    for line in [["%*d"%v for v in zip(ps,table[n])]
                                 for n in range(len(column))]]
    
    str_column=" "*left + "  "
    for x in zip(ps,column):
        str_column = str_column + "%*d"%x + " "        

    if mode == 0:
        str_line=" "*left + " "
    str_line = str_line + "+"
    for i in ps:
        str_line = str_line + "-"*i + "+"        
    
    # 1段目
    if mode == 0:
        str_table = str_column + "\n"
    
    # 2段目以降
    for n in range(len(column)):
        str_table = str_table + str_line + "\n"
        if mode == 0:
            str_table = str_table + "%*d "%(left,column[n])        
        str_table = str_table + "|" + str_table_list[n] + "|\n"
    str_table = str_table + str_line + "\n"
    print(str_table)

一段ずつprintしていた部分をstringの連結にして、最後にまとめてprintするようにしたら、さらに速くなりましたw

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.