Python 交换机/机箱使用情况,如何有效使用if-elif-else功能?

Python 交换机/机箱使用情况,如何有效使用if-elif-else功能?,python,python-3.x,performance,switch-statement,processing-efficiency,Python,Python 3.x,Performance,Switch Statement,Processing Efficiency,我试图构建一个高效的场景,为各种情况检查一个值,每个情况代表需要执行的不同功能。 具体来说,我有一个带有功能按钮的键盘矩阵,所有这些按钮都应该提供不同的功能,但代码应该以高效的方式执行,因此在得出结论之前不要浪费太多时间检查每条语句 下面是我想做的一个示例,但由于lambda的使用/lambda的创建,它似乎仍然效率低下: def data(value): global combination functions = { 'A' : print('

我试图构建一个高效的场景,为各种情况检查一个值,每个情况代表需要执行的不同功能。 具体来说,我有一个带有功能按钮的键盘矩阵,所有这些按钮都应该提供不同的功能,但代码应该以高效的方式执行,因此在得出结论之前不要浪费太多时间检查每条语句

下面是我想做的一个示例,但由于lambda的使用/lambda的创建,它似乎仍然效率低下:

def data(value):
    global combination
    functions = {
                'A' : print('Arm'),
                'B' : pass,
                'C' : lambda x: return False,
                'D' : print('Disarm'),
                '*' : lambda x: return x, #Asterisk=Enter
                '#' : lambda x: x='', #Hashtag=InputCorrection
                }(combination)
    if type(value) is int:
        ##Collect numbers, irrelevant##
        pass
    if type(value) is str:
        ##Function Buttons##
        return functions.get(value, 'Default = Ignore Input')
据我所知,如果elif else(如果elif else)出现这种情况,最快的方法是使用字典,但如果我错了,请纠正我的错误。 我正在寻找一种比
lambda x:
更有效的方法,因为我已经了解到,这些lambda函数是在每次调用
data(value)
函数时生成的,因此会消耗时间

我需要一个省时的程序,因为它不应该减慢检测键盘上“按钮被按下”的过程

还要注意:不可能有不正确的值,因此不会出现错误。即使在调用所提供的函数之前,也会出现故障,但一般来说,在这种情况下,故障不存在

据我所知,实现if-elif-else场景的最快方法是使用字典

不要假设,基准。
timeit
模块是您的朋友

我正在寻找一种比lambda x:更有效的方法,因为我已经了解到这些lambda函数是在每次调用data(value)函数时生成的,因此会占用时间

没错,但在全局命名空间中查找名称也需要时间

还要注意的是,问题并不在于lambda本身,内部函数也会出现同样的问题——当我们处理这个问题时,如果你的lambda只是调用另一个函数(即你有
{“A”:lambda x:funcA(x)}
),你甚至不需要lambda,只要使用
{“A”:funcA,“B”:funcB,}
,您不仅可以节省lambda实例化时间,还可以(更重要的是)使用所有涉及的堆栈操作进行一次函数调用

所以再一次,不要假设,基准

实际上,在您担心基准测试之前,请检查是否真的存在性能问题,然后分析瓶颈所在。我们人类通常很难猜到这类事情,我不止一次看到开发人员浪费时间“优化”错误的代码部分——使其无法读取和维护——却没有获得任何有意义的性能改进,而使用分析器,您可以发现一些“快速胜利”这需要一天的时间来实现,对可读性没有影响,并且戏剧性地提高了性能(有时提高了一个数量级)

回到您的用例——您主要有3种可能的实现,一个普通的if/elif/,一个本地dict和一个全局dict。您可以对每个解决方案进行模拟实现,并使用
timeit
对它们进行基准测试,然后您将知道对于您的python版本,哪种实现最快。如果您计划支持不同的Python版本,请确保对所有版本重复测试

据我所知,实现if-elif-else场景的最快方法是使用字典

不要假设,基准。
timeit
模块是您的朋友

我正在寻找一种比lambda x:更有效的方法,因为我已经了解到这些lambda函数是在每次调用data(value)函数时生成的,因此会占用时间

没错,但在全局命名空间中查找名称也需要时间

还要注意的是,问题并不在于lambda本身,内部函数也会出现同样的问题——当我们处理这个问题时,如果你的lambda只是调用另一个函数(即你有
{“A”:lambda x:funcA(x)}
),你甚至不需要lambda,只要使用
{“A”:funcA,“B”:funcB,}
,您不仅可以节省lambda实例化时间,还可以(更重要的是)使用所有涉及的堆栈操作进行一次函数调用

所以再一次,不要假设,基准

实际上,在您担心基准测试之前,请检查是否真的存在性能问题,然后分析瓶颈所在。我们人类通常很难猜到这类事情,我不止一次看到开发人员浪费时间“优化”错误的代码部分——使其无法读取和维护——却没有获得任何有意义的性能改进,而使用分析器,您可以发现一些“快速胜利”这需要一天的时间来实现,对可读性没有影响,并且戏剧性地提高了性能(有时提高了一个数量级)


回到您的用例——您主要有3种可能的实现,一个普通的if/elif/,一个本地dict和一个全局dict。您可以对每个解决方案进行模拟实现,并使用
timeit
对它们进行基准测试,然后您将知道对于您的python版本,哪种实现最快。如果您计划支持不同的Python版本,请确保对所有版本重复测试

我已经更新了代码并提出了一个可行的解决方案,仅供将来参考。 目前这是可行的,我稍后会做一些基准测试,然后再回来看看这是否是性能最好的方法

更新、基准: 好的,我对代码进行了基准测试,使用的代码和输出如下。 我需要检查如何正确地编写代码,以便以可读的格式进行多次运行和比较,必须手动调整。 但是如上所述,在这种情况下,性能时间并不是一个大问题

通过函数、全局变量

import timeit
导入日志记录
全局组合、函数
有限公司