6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【競プロ】Pythonで複数の値を出力する

Last updated at Posted at 2019-09-29

概要

競技プログラミングでは,形式に沿った出力を行う必要があります.出力する値が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$個を出力しない限りは好みの問題となりそうです.

まとめ

いくつか複数の値を出力する方法を紹介しました.実行時間に差はあるものの,大量に出力しない限りはお好みの出力方法を選べば大丈夫だと思います.

6
6
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?