在我的python代码中,我将一些bool()强制转换为我知道可能已经为布尔值的变量。这有什么缺点吗? (性能等)
这是我正在使用的功能的基本克隆。
import re
pattern= "[A-Z]\w[\s]+:"
other_cond= "needs_to_be_in_the_text"
def my_func(to_check: str) -> bool:
res = re.search(pattern, to_check)
res2 = other_cond in to_check
return bool(res), bool(res2) # res2 either None or True
# I need boolean returns because later in my code I add all these
# returned values to a list and use min(my_list) on it. to see if
# there's any false value in there. min() on list with None values causes exception
答案 0 :(得分:2)
通常不需要强制转换为bool()
,您可以使用更惯用的if:
或if not:
语法,但是如果有必要并且您想避免使用{ {1}},一个相对昂贵的类型构造函数,然后使用更轻量的方法,例如专门功能的bool()
(更多信息here)。
Ipython中Python 3.6的时间说明operator.truth
相对较慢(不过,这通常是不必要的微优化):
bool()
答案 1 :(得分:1)
取决于“几个”是什么,但通常不是。
当然,呼叫bool
比不呼叫bool
慢,但这不太可能成为您的瓶颈。
从理论上讲,将变量强制转换为bool
可以触发大对象的垃圾回收,例如:
x = list(range(100000))
x = bool(x)
if x:
foo()
是否有第二行可能会影响if
主体的调用时间:强制转换时,原始列表超出范围并收集垃圾,不强制转换时,原始列表保留在内存中
我认为这些都是极端情况。
答案 2 :(得分:1)
不看示例代码就很难注释,但是强制转换为bool
可能会损害代码的可读性。例如,如果语句隐式检查语句的真实性,那么添加bool
不会给您任何帮助。
a = [1,2,3]
if a:
pass
vs。用布尔包起来,这意味着要阅读更多。
if bool(a):
pass
如果您要分配新变量,这将意味着更多事情需要跟踪,并且可能会引入错误,导致强制转换变量和原始变量不同步。
a = [1,2,3]
a_bool = bool(a)
if a_bool:
pass # will hit
a = []
if a_bool:
pass # will still get here, even though you've updated a
如果您不进行投射,则没有什么可跟踪的:
a = [1,2,3]
if a:
pass # will get here
a = []
if a:
pass # won't get here.
变量的 真实性在Python中通常被利用,并且使代码更具可读性。花时间习惯如何工作比将内容包装在bool
中更好。