我正在研究机电一体化项目,我从多个来源获取当前(安培)数据,并且必须根据内部和之间的变化值趋势计算响应(馈入机械系统)(增加/减少值和增加/减少相对差异) )。有许多条件要访问(对每个条件的唯一或混合响应)和许多它们依赖的变量,所以我留下了许多嵌套的if-elif-else
语句,每个语句都评估多个条件和标志因此在数据流入时需要时间来响应快速(高达85赫兹)。
该模块是较大项目的一部分,需要仅使用Python完成。以下是我当前代码的部分内容 -
def function(args):
if flag1 and flag2 and condition1 and not condition2:
if condition3 and not flag3:
response += var1
flag4 = True
elif -- :
response = var2
flag3 = False
elif -- :
------------
else :
------------
if not flag_n and flag_m and condition_p and condition_q and not condition_r:
if.. elif ... else :
flags... response changes..
more IFs
我需要的是一种更好,更有效的方法,或者采用完全不同的方法,例如:一些适合上述用途的机器学习或深度学习算法或框架。
你可以使用二进制,也许:
flag_bits = {flag1: 0b0000000001,
flag2: 0b0000000010,
flag3: 0b0000000100,
flag4: 0b0000001000,
condition1: 0b0000010000,
condition2: 0b0000100000,
...}
然后,当您收到标志和条件按位评估它们,并有一个结果或方法的字典来计算基于它的结果:
def add_response(response, add_value):
return response += add_value
def subtract_response(response, subtract_value):
return response -= subtract_value
response_actions = {0b0000110011: ('add', var1, 0b0000001000), ...}
response_methods = {'add': add_response, 'sub': subtract_response, ...}
response_action = response_actions[0b0000110011]
response_method = response_action[0]
response = response_method(response, respnose_action[1])
flag_bits = response_action[2]
显然,并不完全完美,但它会消除大量的ifs并将动作转换为查找,并希望节省时间。
从你的问题来看,我无法理解你的问题是否是if-else语句随着时间的推移变得更大,更混乱,或者它们是计算密集型的。
在任何一种情况下,任何类型的机器学习或深度学习框架都可能比你的if-else慢得多,而且更加令人困惑,因为很难知道为什么-AI-deep-learning-algorithm-what-what-what。如果您的机器人翻转怎么办?你永远不会知道为什么。但是,你可以追踪if-else语句...我强烈建议不要去AI路线,如果你的if-else树不是...... 3000-5000行长,它们每天都在改变100-200行或类似的东西。
软件开发人员通常会尝试遵循良好的设计原则而不会陷入这种情况,但是,如果改变架构为时已晚,那么What is the best way to replace or substitute if..else if..else trees in programs?(多态)就可以解决问题。
话虽这么说,我已经做了很多传感器/数学重型项目,他们的成长总是一样的:项目开始好又慢,然后是好的改进,然后是截止日期,你最终得到一个if-else意大利面。总是一样。至少对于我来说。所以,我现在所做的就是每当我有所改进时,我都会尝试将它添加到源代码中,这样通用架构就能保持一致。
解决这个问题的另一种方法是编写流程图,就像在Matlab的Simulink中一样,并明确地展示了你对项目如何工作/如何实际实现等的总体思路。