#ご挨拶
はじめまして、cells_compです。
ROM専であった私も深夜テンションでQiitaをはじめてしまいました。
記念すべき最初の記事がこんな駄記事で申し訳ないのですが、ひとまず思いついたことを投稿していきたいと思います。
#やってみたこと
Pythonでリスト(l)の要素をランダムに並び替えたいとき、素直に考えれば
- random.shuffle(l)で並び替え
- l2 = random.sample(l, len(l))で並び替え
- 正しくは「リストの中から指定した個数を重複せずにランダム取得」しています。
- 指定した個数=全要素なので結果としてシャッフルしたリストが得られます。
が出てくると思います。ところで、この2つの方法どちらが速いのでしょう?
速さ言い出すならnumpy使えという声が聞こえそうですが、どうかご容赦ください。
#実行環境
Python 3.5.5
Intel® Core™ i7-6700 3.4GHz
Windows10 (WSL)
Ubuntu 16.04 LTS
#実行結果
###random.shuffleの場合
対象リストは整数を格納しています。
import random
import time
if __name__ == '__main__':
l = [i for i in range(1000000)]
start = time.time()
random.shuffle(l)
elapsed_time = time.time() - start
print("elapsed_time:" + str(format(elapsed_time)) + "s")
結果
elapsed_time:0.6656289100646973s
###random.sampleの場合
import random
import time
if __name__ == '__main__':
l = [i for i in range(1000000)]
start = time.time()
l2 = random.sample(l,len(l))
elapsed_time = time.time() - start
print("elapsed_time:" + str(format(elapsed_time)) + "s")
結果
elapsed_time:0.7895145416259766s
はい、random.shuffle()の方が2割ほど速いですね。
やはり元はランダム抽出用の関数なので最適ではない、ということでしょうか。
###おまけ
import random
import time
import numpy
if __name__ == '__main__':
l = [i for i in range(1000000)]
start = time.time()
numpy.random.shuffle(l)
elapsed_time = time.time() - start
print("elapsed_time:" + str(format(elapsed_time)) + "s")
結果
elapsed_time:0.1087648868560791s
終わり!閉廷!以上!みんな解散!
#おわりに
はい、ひとまず初投稿です。
どうにも怖気ついて今まで投稿せずにいましたが、やってみると気楽なものですね。
自己満足的な投稿ですが、たとえ一人でも何らかのお役に立てると嬉しいです。
これからも適時投稿していきたいと思います。
それでは、何卒よろしくお願いいたします。