1

假设我在 python 中有一个变量,称为my_boolean = False 我希望最终结果是:my_bool = "0" 我能想到的唯一方法是。 my_bool = str(int(my_boolean)), 双重类型转换。

有没有更好的方法来做到这一点?缺点?好处?内部会发生什么?

4

4 回答 4

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,并且更喜欢这种方法。换句话说,不,你所做的并没有错。

于 2013-07-24T16:25:46.417 回答
1

您可以使用三元运算符:

'1' if my_boolean else '0'
于 2013-07-24T16:24:47.643 回答
1

可以使用这样的字典映射:

bool_dict = { False : '0', True : '1' }
my_boolean = bool_dict[False]

不确定它是否更有效,我想是这样,因为它只是在地图中进行哈希查找,通常是 O(1) 操作。

于 2013-07-24T16:25:25.677 回答
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  

因此我之前做的基准测试是不正确的。

于 2013-07-24T16:44:27.820 回答