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

2024-10-02 12:30:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个应用程序,我需要能够区分数字和布尔尽快。除了先运行isinstance(value, bool)之外,还有什么其他选择?你知道吗

编辑: 谢谢你的建议。实际上,我想做的是检查那些去掉bools的数字,这样我就可以重新排序我的检查(数字更普遍)并改进negacalls。isinstance()本身已经足够快了。x is True or x is False很有趣。你知道吗


Tags: orfalsetrue应用程序编辑排序isvalue
2条回答

所以,帕德雷克·坎宁安建议,接下来的可能会快一点。我自己对cProfile-ing的快速实验没有显示出任何区别:

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:注意,我在这里使用的是Python2.7。@用户5061可能使用python3(从print()函数中可以看出),因此这里提供的任何解决方案都应该在投入生产之前由OP进行测试,例如YMMV。你知道吗

测试使用python3.4完成。你知道吗

stmt5是由grc提出的。 stmt3boldewyn提出,在大多数情况下似乎是最快的选择(除非数据主要由int组成):

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。当然,这是假设有相等数量的int和bool。你知道吗

另外,正如注释中的grc所建议的那样,“True更快,因为它在第一次比较后短路,所以如果使用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

如果您的数据主要由整数组成,那么这将成为最快的选项(0.0453750.0390963)。你知道吗

相关问题 更多 >

    热门问题