概要
競技プログラミングでは,形式に沿った出力を行う必要があります.出力する値が1,2個の場合は簡単ですが,これが可変個の場合はやや大変です.そこで,いくつかの出力方法を紹介し,またその実行速度の比較を行います.
空白区切り
次のような出力方法が考えられます:
ans = [1, 2, 3, 4, 5]
# その1 for
for a in ans[:-1]:
print(a, end=' ')
print(ans[-1])
# その2 join結合
print(' '.join(map(str, ans)))
# その3 アンパック
print(*ans)
どう考えてもアンパックが簡単に書けて,バグも生じにくいように思えます.ちなみに*ans
はの意味するところは以下のようになります.
# 以下2つは同じ
print(*[1, 2, 3, 4, 5])
print(1, 2, 3, 4, 5)
次に速度比較を見てみます:上のコードにて
ans = list(range(10**6))
として,AtCoderのコードテストで実行した結果です.
種類 | 実行時間(ms) |
---|---|
for | 1000 |
join | 250 |
*ans | 450 |
forは遅いようです.一方でjoin
で結合したほうが*ans
より2倍程度高速です.ですが$10^6$個も出力しない限りは*ans
で十分でしょう.
改行区切り
こちらは空白区切りと殆ど変わりません:
ans = [1, 2, 3, 4, 5]
# その1 for
for a in ans:
print(a)
# その2 join結合
print('\n'.join(map(str, ans)))
# その3 アンパック
print(*ans, sep='\n')
実行速度は次のようになりました:
種類 | 実行時間(ms) |
---|---|
for | 700 |
join | 240 |
*ans | 450 |
forがかなり早くなりました.どうやらend
を指定すると遅くなる様子です.しかしながら実行時間は空白区切りのときと一緒で,join < *ans < for の順です.ですが先程と同様に$10^6$個を出力しない限りは好みの問題となりそうです.
まとめ
いくつか複数の値を出力する方法を紹介しました.実行時間に差はあるものの,大量に出力しない限りはお好みの出力方法を選べば大丈夫だと思います.