1

my_boolean = False 最終結果を次のようにしたいというpythonの変数があるとします:my_bool = "0" これを行うことを考えることができる唯一の方法は. my_bool = str(int(my_boolean))、二重型キャスト。

これを行うより良い方法はありますか?短所は?利点?内部的にはどうなりますか?

4

4 に答える 4

1

操作のパフォーマンスを想定しないでください。プロファイルとベンチマーク:

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  

したがって、以前に行ったベンチマークは正しくありませんでした。

于 2013-07-24T16:44:27.820 に答える