在Python中区分bools和数字的最佳方法是什么?

时间:2015-02-24 10:28:11

标签: python

我有一个应用程序,我需要能够尽快区分数字和bool。除了先运行isinstance(value, bool)之外还有哪些其他选择?

编辑: 谢谢你的建议。实际上,我想要做的就是检查数字,这样可以减少我的支票(数字更为普遍),并改善我的负面因素。 isinstance()本身就足够快了。 x is True or x is False很有趣。

2 个答案:

答案 0 :(得分:5)

所以,Padraic Cunningham建议,以下可能会更快一些。我自己用cProfile进行的快速实验没有显示出任何差异:

isbool = value is True or value is False

我认为这是你能得到的最快速度:两种非类型强制比较。

编辑:我重播了@user 5061的时序测试,并添加了我的陈述。这是我的结果:

>>> import timeit
>>> stmt1 = "isinstance(123, bool)"
>>> stmt2 = "123 is True or 123 is False"
>>> t1 = timeit.timeit(stmt1)
>>> t2 = timeit.timeit(stmt2)
>>> print t1
0.172112941742
>>> print t2
0.0690350532532

编辑2:请注意,我在这里使用的是Python 2.7。 @user 5061可能使用Python 3(从print()函数说明),因此这里提供的任何解决方案都应该在投入生产之前由OP测试,对于YMMV。

答案 1 :(得分:3)

使用Python 3.4完成测试。

grc建议

stmt5boldewyn建议stmt3,在大多数情况下似乎是最快的选择(除非数据主要由整数组成):

import timeit

setup = "a = 123; b = True"

stmt1 = "isinstance(a, bool) ; isinstance(b, bool)"
stmt2 = "isinstance(a, int) ; isinstance(b, int)"

stmt3 = "a is True or a is False; b is True or b is False"

stmt4 = "type(a) is bool; type(b) is bool"  
stmt5 = "a.__class__ is bool ; b.__class__ is bool"


repetitions = 10**6
t1 = timeit.timeit(stmt1, setup=setup, number=repetitions)
t2 = timeit.timeit(stmt2, setup=setup, number=repetitions)
t3 = timeit.timeit(stmt3, setup=setup, number=repetitions)
t4 = timeit.timeit(stmt4, setup=setup, number=repetitions)
t5 = timeit.timeit(stmt5, setup=setup, number=repetitions)


print(t1)
print(t2)
print(t3)
print(t4)
print(t5)

结果:

0.251072
0.190989
0.037483
0.140759
0.08480

请注意,isinstance(123, bool)isinstance(123, int)慢。因此,我必须同时使用ab。这当然是假设你有相同数量的整数和布尔。

另外,正如评论中提到的grc" True更快,因为它在第一次比较后短路"所以如果你使用{{1你b = False的时间会慢一点。


仅在数据包含stmt3时才可用:

0, 0.0, 1, 1.0

结果:

setup = "a = 123; b = True; s = {True, False}"

stmt3 = "a is True or a is False; b is True or b is False"
stmt6 = "a in s ; b in s"

如果您的数据主要由整数组成,那么这将成为最快的选择(0.037680588 0.03936778 vs 0.045375)。