首页 > 解决方案 > 案例的笛卡尔积的代码设计

问题描述

我有一个根据以下逻辑的算法:

两个参数x和分别y取值A={1,2,3,4}和。B={'a','b','c'}

根据对的值,(x,y)算法应该执行一系列相应的步骤集f_x_y,但不要将其视为由andf_x_y参数化的一段代码。需要执行的指令与对应的指令不同。不同的代码段,一个对应于 和 的笛卡尔积中的每一对。套和不是太大。它们的尺寸和上面差不多。xy(x,y)=(1,'a')(2,'c')ABAB

我考虑了以下选项:

选项 1:使用ifs 的实现。

if x == 1:
  if y == 'a':
    f_1_a
  elif y == 'b':
    f_1_b # Remember that it is not a function, but an entirely different piece of code as f_1_a
  # Rest of the cases inside x=1
elif x == 2:
  if y == 'a':
    f_2_a
# etc.

选项 2:从案例到功能的映射。

def f_1_a():
  pass
def f_1_b():
  pass
# ...
cases = {(1,'a'):f_1_a,(1,'b'):f_1_b,} # ...
cases[(x,y)]()

问题:我应该更喜欢其中哪一个或其他替代方案?

我的直觉是,如果有新的要求,第二个很容易修改。

我没有足够的经验来判断是否有更快的速度更可取。

标签: pythondesign-patterns

解决方案


从性能的角度来看:第二种方法更好。
原因是分支(即if's 和else's)导致 CPU 的指令流水线被清除,这意味着我们丢失了流水线中的任何预加载指令,而访问映射元素只是一个问题计算密钥的哈希值。虽然这对于编译语言来说是正确的,但我认为在 Python 的情况下并没有太大的不同。
从设计的角度来看:第二种方法仍然更好。
就像你说的,添加/删除/编辑任何需求都更容易,你只需要查找相应的键。在第一种方法中,您必须绕过那些“丑陋”的if's 和else's。


推荐阅读