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() 使います