假设我在 python 中有一个变量,称为my_boolean = False
我希望最终结果是:my_bool = "0"
我能想到的唯一方法是。
my_bool = str(int(my_boolean))
, 双重类型转换。
有没有更好的方法来做到这一点?缺点?好处?内部会发生什么?
你可以试试
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' if my_boolean else '0'
可以使用这样的字典映射:
bool_dict = { False : '0', True : '1' }
my_boolean = bool_dict[False]
不确定它是否更有效,我想是这样,因为它只是在地图中进行哈希查找,通常是 O(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
因此我之前做的基准测试是不正确的。