【问题标题】:Python: optimisation of AND evaluation [duplicate]Python:AND评估的优化[重复]
【发布时间】:2019-06-27 12:39:18
【问题描述】:

在 Python 3 中,我必须检查函数参数中没有发生 3 个条件,因此,我创建了 3 个函数:

def check_lenght(string_id):
    # if length is right, return True, otherwise, False

def check_format(string_id):
    # return True if some internal format has to be used, in another case, False

def check_case_num(string_id):
    # manual iteration to check if certain characters are not contained, return True, otherwise, False


def valid_product_code(id_str):
    return check_lenght(id_str) and check_format(id_str) and check_case_num(id_str)

所以,有 3 个函数,其中一个迭代字符串,这是一个潜在的非常繁重的操作。 但是,如果一个函数已经返回 False,则无需检查其余函数,我们知道逻辑 AND 将返回 False,从而能够降低计算成本。

所以,我想知道 Python(CPython 或其他实现)是否对此进行了优化,因此,return check_lenght(id_str) and check_format(id_str) and check_case_num(id_str) 的使用是正确的,或者最好一一检查这些函数并尽快返回 False其中第一个是 False,具有更优化但可能不太可读的解决方案。

如何在 Python 中评估此表达式?

我试图在谷歌上搜索这个问题的答案,也在这个网站上找到答案

【问题讨论】:

    标签: python python-3.x optimization evaluation


    【解决方案1】:

    它叫做short-circuiting,是的,Python 确实支持它:

    https://docs.python.org/3/library/stdtypes.html#boolean-operations-and-or-not

    【讨论】:

    • 嗯。当然,之前有人问过并回答过。欢迎来到 SO
    • 诀窍是知道在哪里寻找重复项。
    • 感谢和抱歉重复,我在谷歌和这里搜索,但我找不到答案
    【解决方案2】:

    如果a 已经返回Falsea and b and c 将不会评估bc

    如果x 已经返回Truex or y 将不会评估y

    您会发现这就是布尔运算符在几乎所有类 C 语言中的工作方式。

    【讨论】:

    • 这听起来不对。不过,也许我误解了你的意思。
    • @MadPhysicist 它是短路定义的一部分。如果a 已经是False,则不会评估b
    • 啊,我想我理解其中的困惑,为清楚起见进行了编辑。
    • 谢谢。投票翻转。
    猜你喜欢
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 2012-03-27
    • 1970-01-01
    • 2018-01-05
    • 2021-03-02
    相关资源
    最近更新 更多