LoginSignup
1
0

More than 3 years have passed since last update.

Pythonのshuffleとsample、どっちが速い?

Posted at

ご挨拶

はじめまして、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

終わり!閉廷!以上!みんな解散!

おわりに

はい、ひとまず初投稿です。
どうにも怖気ついて今まで投稿せずにいましたが、やってみると気楽なものですね。
自己満足的な投稿ですが、たとえ一人でも何らかのお役に立てると嬉しいです。
これからも適時投稿していきたいと思います。
それでは、何卒よろしくお願いいたします。

1
0
0

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
1
0