python中的多个类型转换是不是很糟糕?

时间:2013-07-24 16:17:36

标签: python casting

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

有更好的方法吗? 缺点是什么?好处? 内部会发生什么?

4 个答案:

答案 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  

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