はじめに
Pythonのスライス機能は非常に便利で、コロン(":")での表記が一般的ですが、組み込み関数slice()
は複雑な操作などや変数へ保存する場合に役立ちます。
slice()
の使い道として、複数の配列に対して同じスライスをする適用する場合などが挙げられます。(コロン表記では、通常変数のスライス情報の保存はできないです。)
Pythonはコロン表記がお馴染みで、あまりslice()
が知られていないと思い、本記事を書きました。
コロン":"とslice()
の比較
コロン":"とslice()
の書き方と処理速度を簡単に比較します。
実装はGoogle Colabに挙げています。
書き方
コロン(":")の使用
リストのスライスは通常、start:stop:step
の形式で記述されます。start
はスライスの開始位置、stop
は終了位置、step
はステップ(スキップする幅)を指定します。
slice()
の使用
slice()
オブジェクトはslice(start, stop, step)
の形式で記述されます。start
、stop
、step
はコロンで指定する各要素と同じ意味です。
例1(要素番号1から6までを1ずつ抜き出す)
lis = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
と定義したときに、lis
の要素番号1
から6
まで1ずつ抜き出す場合の書き方です。
# 例1(要素番号1から6までを1ずつ抜き出す)
lis = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print('slice coron:', lis[1:7])
slice_object = slice(1, 7, 1)
print('slice object:', lis[slice_object])
print('slice object:', lis[slice(1, 7, 1)]) # もちろん直接slice()を書いてもOK
print('slice object:', lis[slice(1, 7)]) # 1ずつ抜き出す場合は最後の引数を省略OK
print('slice object:', lis[slice(1, 7, None)]) # 1ずつ抜き出す場合は最後の引数を`None`でもOK
slice coron: [1, 2, 3, 4, 5, 6]
slice object: [1, 2, 3, 4, 5, 6]
slice object: [1, 2, 3, 4, 5, 6]
slice object: [1, 2, 3, 4, 5, 6]
slice object: [1, 2, 3, 4, 5, 6]
例2(要素番号1から6までを2ずつ抜き出す)
lis
の要素番号1
から6
まで2ずつ抜き出す場合の書き方も確認しておきます。
# 例2(要素番号1から6までを2ずつ抜き出す)
lis = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print('slice coron:', lis[1:7:2])
slice_object = slice(1, 7, 2)
print('slice object:', lis[slice_object])
slice coron: [1, 3, 5]
slice object: [1, 3, 5]
例3(コロンの要素番号の省略のslice()での書き方)
# 例3(要素を2ずつ抜き出す)
lis = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print('slice coron:', lis[::2])
slice_object = slice(None, None, 2) # コロンの省略は`None`に対応
print('slice object:', lis[slice_object])
slice coron: [0, 2, 4, 6, 8]
slice object: [0, 2, 4, 6, 8]
例4(slice()のトリッキーな書き方))
# 例4(要素番号0から2まで1ずつ抜き出す)
lis = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print('slice coron:', lis[:2:])
print('slice object:', lis[slice(None, 2, None)]) # コロンの省略は`None`に対応
print('slice object:', lis[slice(2)]) # 少しトリッキーな書き方
slice coron: [0, 1]
slice object: [0, 1]
slice object: [0, 1]
処理速度の比較
処理速度の比較には、同じ処理を1000万回を5反復した平均を使って評価します。以下はGoogle Colabで%%timeit
を用いて計測した結果になります。
※処理速度の比較は、あまり深く検討しているわけではないので参考までにお願いします。
%%timeit -n 10000000 -r 5
lis = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
slice_coron = lis[1:7:2]
# -> 221 ns ± 54.9 ns per loop (mean ± std. dev. of 5 runs, 10000000 loops each)
%%timeit -n 10000000 -r 5
lis = [0, 1, 2, 3, 4, 5]
slice_object = lis[slice(1, 7, 2)]
# -> 327 ns ± 124 ns per loop (mean ± std. dev. of 5 runs, 10000000 loops each)
コロンの方が処理速度自体は速い結果となりました。
まとめ
Pythonのリストスライスには通常コロン(":")で十分ですが、複数の配列にスライスを適用する場合やスライス情報を変数に保存したい場合には、slice()
も便利です。ちなみに、処理速度はコロンの方が速い結果となったので、状況によって使い分けていきましょう。
参考資料