假设我在python中有一个名为my_boolean = False
的变量
我希望最终结果为:my_bool = "0"
我能想到这样做的唯一方法是。
my_bool = str(int(my_boolean))
,双重类型转换。
有更好的方法吗? 缺点是什么?好处? 内部会发生什么?
答案 0 :(得分:3)
你可以尝试
my_bool = '01'[my_boolean]
您的方法与上述方法之间似乎存在时差:
>>> from timeit import timeit
>>> timeit("'01'[b]", "b = False")
0.10460775769296968
>>> timeit("str(int(b))", "b = False")
0.8879351199904466
是否会失去睡眠?当然不。我敢肯定,有些人会把你当前的方法称为Pythonic,并且更喜欢这个。换句话说,不,你正在做的事情没有错。
答案 1 :(得分:1)
您可以使用三元运算符:
'1' if my_boolean else '0'
答案 2 :(得分:1)
可以使用这样的字典映射:
bool_dict = { False : '0', True : '1' }
my_boolean = bool_dict[False]
不确定它是否更有效率,我想是这样的,因为它只是在地图中查找哈希,通常是O(1)操作。
答案 3 :(得分: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))
比其他慢,因为函数调用的开销很高。
注意分支操作大多等同于字典查找[尝试几次,你会看到两个版本的交换时间],但是它更具可读性,所以使用它
我个人觉得条件表达式版本比原始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
因此我之前做的基准测试不正确。