疑問
pythonではマッピング型の組み込みはdictです。
キーが含まれているかどうかの判定は以下のどちらでやるのが適切なのでしょうか?
python
1#1 2b = key in dict.keys() 3#2 4b = key in dict
そう思った理由はたまに方法として#1
の方法を紹介しているサイトがあるからです。
速度検証
動きが同じなら速度で見るのが良いかと思い、速度を測ってみました。
検証コード
python
1import time 2from math import sqrt 3 4mean=lambda list: sum(list)/len(list) 5def stdev(list): 6 avg = mean(list) 7 return sqrt(sum([(x-avg)*(x-avg) for x in list])/(len(list)-1)) 8 9N=1000000 10REP=100 11dic = {float(x):float(x) for x in range(N)} 12 13def func(f): 14 sum = 0 15 start = time.time() 16 for i in range(N): 17 sum += f(i) 18 end = time.time() 19 if sum != N: 20 raise Exception 21 return end - start 22 23def func2(f): 24 times = [func(f) for i in range(REP)] 25 print(str(mean(times)) + "\t" + str(stdev(times))) 26 27func2(lambda x: x in dic) 28keys = dic.keys() 29func2(lambda x: x in keys) 30func2(lambda x: x in dic.keys())
※hayataka2049さんの回答より、dic.keys()を事前に計算する方式を追加。ついでに測定回数を100回にし、平均と標準偏差を出した。
検証結果
####測定環境
項目 | 値 |
---|---|
Host OS | Windows 10 Home 10.0.18362.535 |
VM | VirtualBox 6.0.14 r133895 (Qt5.6.2) |
Guest OS | Ubuntu 19.04 |
Kernel | 5.0.0-37-generic #40-Ubuntu SMP Thu Nov 14 00:14:01 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux |
CPU | AMD Ryzen 5 1400 3.2GHz |
####測定結果
Python実装 | バージョン | #1(毎回keys()) | #1(固定keys) | #2 | 補足 |
---|---|---|---|---|---|
CPython | 2.7.16 | (計測断念) | (計測断念) | 0.166±0.005 | - |
CPython | 3.7.3 | 0.1888±0.005 | 0.150±0.005 | 0.147±0.004 | - |
PyPy | 2.7.13 | (計測断念) | (計測断念) | 0.069±0.003 | docker使用 |
PyPy | 3.6.9 | 0.084±0.004 | 0.074±0.005 | 0.070±0.004 | docker使用 |
Cython | 3.7.3 | 0.157±0.010 | 0.109±0.003 | 0.107±0.004 | Jupyter Notebook使用 |
単位: 秒
測定回数: 100
####考察
バージョンに依らず、#2
の方法が速いように見える
質問
dictにキーが含まれているかどうかの判定はどのようにやるのが、適切なのでしょうか?
なるべく正確な理由を添えて教えて下さい
※あまりに不正確と思ったときは低評価にします
※質問内容は時間内なら訂正要求に応じて随時訂正しますが、追記などの手段は取りません
※日本時間2019年12月27日正午以降ベストアンサー選択を含め、いかなる更新もしません
※いかなる場合も自己解決はしません
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/12/24 06:55
2019/12/24 07:36
退会済みユーザー
2019/12/24 07:46
2019/12/24 08:00
退会済みユーザー
2019/12/24 08:21
2019/12/24 08:58
2019/12/27 00:20
退会済みユーザー
2019/12/27 02:53
2019/12/27 03:02