python - 案例的笛卡尔积的代码设计
问题描述
我有一个根据以下逻辑的算法:
两个参数x
和分别y
取值A={1,2,3,4}
和。B={'a','b','c'}
根据对的值,(x,y)
算法应该执行一系列相应的步骤集f_x_y
,但不要将其视为由andf_x_y
参数化的一段代码。需要执行的指令与对应的指令不同。不同的代码段,一个对应于 和 的笛卡尔积中的每一对。套和不是太大。它们的尺寸和上面差不多。x
y
(x,y)=(1,'a')
(2,'c')
A
B
A
B
我考虑了以下选项:
选项 1:使用if
s 的实现。
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)]()
问题:我应该更喜欢其中哪一个或其他替代方案?
我的直觉是,如果有新的要求,第二个很容易修改。
我没有足够的经验来判断是否有更快的速度更可取。
解决方案
从性能的角度来看:第二种方法更好。
原因是分支(即if
's 和else
's)导致 CPU 的指令流水线被清除,这意味着我们丢失了流水线中的任何预加载指令,而访问映射元素只是一个问题计算密钥的哈希值。虽然这对于编译语言来说是正确的,但我认为在 Python 的情况下并没有太大的不同。
从设计的角度来看:第二种方法仍然更好。
就像你说的,添加/删除/编辑任何需求都更容易,你只需要查找相应的键。在第一种方法中,您必须绕过那些“丑陋”的if
's 和else
's。
推荐阅读
- php - 来自多个表的多行的 MySQL SUM
- ios - 通过表视图控制器删除 JSON 对象的内容 - SWIFT
- c++ - OpenCV c++ API VideoCapture 不适用于视频文件
- batch-processing - 将txt文件与批处理合并
- apache-flink - 如何针对 yarn-cluster 运行 sql-client
- apache-atlas - 无法在 Apache Atlas 中找到其他实体类型。只显示 hdfs_path
- php - Laravel 之间的日期时间
- c++ - 时间:2019-05-10 标签:c++lockfree queue implementationsingleproducersingleconsumer
- javascript - Datepicker 事件处理程序上的日期未更改
- python - 保存 Jupyter Notebook 时出现意外错误:'ascii' 编解码器无法在位置 1885 编码字符 u'\xd7':序数不在范围内(128)