LoginSignup
0
0

More than 1 year has passed since last update.

random.choice() vs secrets.choice() 速度比較

Posted at

random.choice() vs secrets.choice() 速度比較

疑似乱数生成器である random.choice() と
暗号論的擬似乱数生成器 secrets.choice() の速度比較してみました。

セキュアな乱数生成するのに secrets.choice() 使いたいけど、100倍くらい遅かったらやだなぁというのがモチベーションです。

こんなソース

import random
import secrets
import time
import statistics

random_times = []
secrets_times = []
for i in range(100):
    random_start_time = time.time()
    random_result = random.choice(["a","b","c","d"])
    random_times.append(time.time() - random_start_time)

    secrets_start_time = time.time()
    secrets_result = secrets.choice(["a","b","c","d"])
    secrets_times.append(time.time() - secrets_start_time)

print("random mean={}sec, std={}sec.".format(statistics.mean(random_times),statistics.stdev(random_times)))
print("secrets mean={}sec, std={}sec.".format(statistics.mean(secrets_times),statistics.stdev(secrets_times)))

macOS 実行結果

macOS Monterey / MacBookPro(13-inch,M1,2020)

random mean=1.6307830810546875e-06sec, std=2.936044302471756e-06sec.
secrets mean=4.281997680664063e-06sec, std=4.396602733953974e-06sec.

平均値で約2.6倍遅く、標準偏差で1.5倍ばらつきがある

ラズパイ 実行結果

Raspbian GNU/Linux 10 (buster)
Linux raspberrypi 5.10.63-v7l+

random mean=5.178451538085937e-06sec, std=1.6347191595371236e-06sec.
secrets mean=1.6834735870361328e-05sec, std=8.922730321211521e-06sec.

平均値で約3.25倍遅く、標準偏差で5.46倍ばらつきがある

GPUマシン 実行結果(自作)

Ubuntu 20.04.2 LTS (GPUマシン)
AMD Ryzen 7 2700 / NVIDIA GeForce 3090 RTX / 2080 RTX

random mean=1.1086463928222657e-06sec, std=6.468622126618904e-07sec.
secrets mean=5.218982696533203e-06sec, std=2.60643995534898e-06sec.

平均値で約4.74倍遅く、標準偏差で4.02倍ばらつきがある

まとめ

思ったより遅くなかったので、今後は secrets.choice() 使います

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