こんにちは、コーダーさん 競技プログラミングがどんなものか、皆さんはよくご存知だと思います。
しかし、pythonでコーディングするときに、心に留めておかなければならない重要なことがいくつかあります。
これらの小さなことが、あなたのコードに大きな違いを生み出すのです。
Pythonで競うプログラミング
少しづつ勉強していきましょう。
1. ジェネレーターの使用
ジェネレータの使用は、スペースと時間の両方を削減することができ、関数を使用するよりも優れています。
ジェネレーター関数の例を以下に示します。
また、複数の値を同時に返す場合にも有効です。
1
2
3
4
5
6
|
def FirstGen():
yield 1
yield 2
yield 3
for i in FirstGen():
print (i,end = " " )
|
この記事もチェック:Pythonのmapメソッドの使い方|ラムダ関数や引数が複数の場合の使い方も解説
2. ビルトイン関数の利用
ビルトイン関数やライブラリを利用することは、通常の方法よりも良い方法です。
最初のリストの要素の2乗を含む新しいリストを作る簡単なプログラムを見てみよ う。
この違いをよりよく説明するために、time ` モジュールを使ってプログラムの実行時間を計算します。
1
2
3
4
5
6
7
8
9
10
11
12
|
import time
start_time = time.time()
def get_square(x):
return x * * 2
l1 = [i for i in range ( 100000 )]
l2 = []
for i in l1:
l2.append(get_square(i))
print ( len (l2))
print ( "Time taken by the code: %s seconds." % (time.time() - start_time))
|
上記の方法では、0.06881594657897949`秒で正しい出力が得られますが、これは間違いなく十分な時間です。
では、同じプログラムをビルトイン関数の map
を使って、宣言した関数をリストに直接適用してみましょう。
1
2
3
4
5
6
7
8
9
10
|
import time
start_time = time.time()
def get_square(x):
return x * * 2
l1 = [i for i in range ( 100000 )]
l2 = list ( map (get_square,l1))
print ( len (l2))
print ( "Time taken by the code: %s seconds." % (time.time() - start_time))
|
ここでは、同じリストにかかる時間は 0.048911094665527344
秒であり、これは非常に小さな差に見えるかもしれませんが、さらに大きなデータではこの差は大きくなる傾向があります。
3. itertools の使用
itertools モジュールは、いくつかの複雑な問題を解決するのに本当に役に立つ。
例えば、リストのすべての並べ換えを見つけるために、以下のプログラムを見てみましょう。
1
2
3
|
import itertools
x = list (itertools.permutations([ 1 , 2 , 3 ]))
print (x)
|
同じことは、独自のロジックや関数を作成することによっても可能だが、それはあまりにも複雑で、時間的な複雑さも悪化することになる。
4. map関数の使用
整数配列の全要素を空白で区切って1行で入力する必要がある場合、map関数を使うのが一番です。
1
2
|
l1 = list ( map ( int , input ( "Enter all the elements: " ).split()))
print (l1)
|
map` 関数を使うと、1 行に複数の値を入力する場合の複雑な処理を簡単にすることができます。
5. 文字列の連結
複数の文字列を連結するには、2つの方法を使うことができる。
文字列を文字列に追加する方法と、join関数を使用する方法です。
結合関数を使用すると、連結処理全体を1行で行うことができ、文字列の数が膨大になった場合の複雑さを軽減することができます。
最初のアプローチを見てみましょう。
文字列の加算処理を使う方法です。
以下のプログラムは、実行時間として 0.00498509407043457
秒になります。
1
2
3
4
5
6
7
8
|
import time
start_time = time.time()
l = [ str (i) for i in range ( 10000 )]
st = ""
for i in l:
st + = i
print ( len (st))
print ( "Time taken by the code: %s seconds." % (time.time() - start_time))
|
一方、2番目のアプローチ。
結合演算を使用すると、実行時間はわずか0.002988576889038086
秒となり、明らかに短くなります。
1
2
3
4
5
6
7
|
import time
start_time = time.time()
l = [ str (i) for i in range ( 10000 )]
st = ""
st.join(l) print ( len (st))
print ( "Time taken by the code: %s seconds." % (time.time() - start_time))
|
まとめ
今日、あなたは Python プログラミング言語で競技プログラミングを行う際に、非常に基本的でありながら重要なことを学びました。
このトリックはきっと、解答の効率と精度を大きく向上させるのに役立つことでしょう。
ぜひ試してみてください。