我有一个应用程序,我需要能够尽快区分数字和bool。除了先运行isinstance(value, bool)
之外还有哪些其他选择?
编辑:
谢谢你的建议。实际上,我想要做的就是检查数字,这样可以减少我的支票(数字更为普遍),并改善我的负面因素。 isinstance()
本身就足够快了。 x is True or x is False
很有趣。
答案 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建议 stmt5
。
boldewyn建议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)
慢。因此,我必须同时使用a
和b
。这当然是假设你有相同数量的整数和布尔。
另外,正如评论中提到的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
)。