題の通りの事をする関数を以下のように二種類作ってみたところ
python
1unnecessary_keys = ('s', 'd', 't', 'step', 'duration', 'transition', ) 2 3def method_1(d): 4 d = d.copy() 5 for key in unnecessary_keys: 6 d.pop(key, None) 7 return d 8 9def method_2(d): 10 return { 11 key: value for key, value in d.items() 12 if key not in unnecessary_keys 13 } 14 15sample_dict = {'x': 100, 'y': 200, 'd': 10, 't': 'in_cubic', } 16assert method_1(sample_dict) == {'x': 100, 'y': 200, } 17assert method_2(sample_dict) == {'x': 100, 'y': 200, } 18 19from timeit import timeit 20print(timeit(lambda: method_1(sample_dict))) # => 5.955087270995136 21print(timeit(lambda: method_2(sample_dict))) # => 7.697444974000973
内包表記を使っていないmethod_1()
の方が速いという結果になりました。これよりも速い方法を知ってませんか?
補足
- 与えられる辞書に含まれる
unnecessary_keys
以外のkeyは一つか二つである事が多いです。(つまりsample_dict
のような物が多い) 除きたいkeyは上に書いた6つで固定されています。unnecessary_keys
は上に書いた内容で常に固定されています。
環境
CPython 3.7.1
追記
得られた回答を元に以下の6つも比較対象に加えた結果
unnecessary_keys = ('s', 'd', 't', 'step', 'duration', 'transition', ) intersection = set(unnecessary_keys).intersection def method_3a(d): '''ppaulさんのmethod_3に少し手を加えた物''' d = d.copy() for key in intersection(d): d.__delitem__(key) return d def method_3b(d): '''method_3aの'd.__delitem__'をloopの外に出した物''' d = d.copy() delitem = d.__delitem__ for key in intersection(d): delitem(key) return d def method_4a(d): '''ppaulさんのmethod_4''' d = d.copy() for key in unnecessary_keys: if key in d: d.__delitem__(key) return d def method_4b(d): '''method_4aの'd.__delitem__'をloopの外に出した物''' d = d.copy() delitem = d.__delitem__ for key in unnecessary_keys: if key in d: delitem(key) return d def method_5(d): '''quickquipさんの方法''' d = d.copy() for key in unnecessary_keys: if key in d: del d[key] return d def method_6(d): '''quickquipさんの方法''' d = d.copy() for key in intersection(d): del d[key] return d
1 : 6.086940804998449 2 : 7.495010836995789 3a: 5.200945402000798 3b: 5.059846481999557 4a: 5.46594832399569 4b: 5.468696205003653 5 : 5.198188450005546 6 : 4.907909608999034
以下の順となりました。code全体
method_6
method_3b
とmethod_5
(順位は不安定。method_3b
の方が速いことが多い)method_3a
method_4a
とmethod_4b
(順位は不安定)method_1
method_2
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/07 06:36
2021/05/07 06:46
2021/05/07 06:53 編集
2021/05/07 06:55
2021/05/07 07:09 編集
2021/05/07 07:19 編集
2021/05/07 07:46