my_boolean = False
最終結果を次のようにしたいというpythonの変数があるとします:my_bool = "0"
これを行うことを考えることができる唯一の方法は.
my_bool = str(int(my_boolean))
、二重型キャスト。
これを行うより良い方法はありますか?短所は?利点?内部的にはどうなりますか?
操作のパフォーマンスを想定しないでください。プロファイルとベンチマーク:
In [7]: value = False
In [8]: %%timeit bool_dict = {False: '0', True: '1'}
...: my_boolean = bool_dict[value]
...:
10000000 loops, best of 3: 47.7 ns per loop
In [9]: %timeit my_boolean = str(int(value))
1000000 loops, best of 3: 420 ns per loop
In [10]: %timeit my_boolean = '0' if value is False else '1'
10000000 loops, best of 3: 50 ns per loop
In [11]: %timeit my_boolean = '01'[value]
10000000 loops, best of 3: 52.1 ns per loop
ご覧のとおり、関数呼び出しのオーバーヘッドが高いため、 は他のものよりstr(int(value))
もはるかに低速です。
分岐操作が辞書検索とほとんど同じであることに注意してください [数回試してみると、2 つのバージョンがタイミングを交換することがわかります]。
個人的には、 2 つの変換を使用しても本質的に問題はありませんがstr(int(value))
、元の よりも条件式のバージョンの方が読みやすいと思います。他の状況では、これがより簡単な解決策になる可能性があります。
バージョン'01'[value]
は最速ですが、特にこの変換がボトルネックであることを証明していない場合は、パフォーマンスよりも読みやすさを優先する必要があると思います.
明示的な定数の代わりに識別子を使用すると、次のことがわかりFalse
ました。
'01'[False]
インタープリターによって次の式に最適化されます"0"
。
In [14]: import dis
In [16]: def test():
...: a = '01'[False]
In [17]: dis.dis(test)
2 0 LOAD_CONST 3 ('0')
3 STORE_FAST 0 (a)
6 LOAD_CONST 0 (None)
9 RETURN_VALUE
したがって、以前に行ったベンチマークは正しくありませんでした。