实现最佳性能的一种简单方法是构建一个大表,存储所有可能的(a, b)对的结果。但是,这可能会消耗大量内存,并且对于大的n来说是不实际的

下面是如何使用普通方法优化代码,如下所述。在

1。将显式and用于逻辑表达式

正如评论中所建议的那样,由于and的short circuiting行为,这更具可读性和效率。在我的测试中,仅此更改就将运行时减少60%。在

2。消除冗余条件

由于a和b的范围从1到{},如果a == n**2,那么{}永远无法实现。因此,条件a%n == 0 and a != n**2 and b == a + 1中的a != n**2检查是多余的。第三种情况也是如此。消除它们可以简化这些条件:...

elif a % n == 0 and b == a + 1:

elif (a - 1) % n == 0 and b == a - 1:

...

3。避免在条件下重复计算

注意,上述条件得到改善

a % n == 0 and b == a + 1和{}是abs(a - b) == 1的特例。{cd16>因此可以使用这些条件重写。在

^{pr2}$

还要注意,值abs(a - b)与所有条件相关。因此,可以在检查所有条件之前计算它。随着这种变化,代码变成d = abs(a - b)

if d == 0: return 6

elif d == 1:

if a % n == 0 and b > a: return 0

elif b % n == 0 and a > b: return 0

else return 1

elif d == n - 1:

if a % n == 0 and a > b: return 1

elif b % n == 0 and b > a: return 1

else return 0

elif d == n: return 1

else: return 0

4。简化逻辑

例如,上面第一个嵌套的if-else可以简化为if min(a, b) % n == 0: return 0

else return 1

更紧凑的语法是:return 1 if min(a, b) % n == 0 else 0

5。应用特定于Python的优化

在Python中,数字0被认为具有错误的值。所以对于数,if d != 0:和{}分别等价于if d:和{}。后者要快一点。应用此更改将生成以下优化代码(这里使用更紧凑的语法来缩短答案)。在d = abs(b - a)

if not d: return 6

elif d == 1: return 1 if min(a, b) % n else 0

elif d == n - 1: return 0 if max(a, b) % n else 1

else: return 1 if d == n else 0

应用上面的步骤2到5可以将运行时间再减少50%。

6。根据输入分布调整条件顺序

这种变化依赖于对应用程序中实际输入分布的了解。目标是使更常见的输入更快地返回。在这个例子中,假设输入a和{}均匀分布在[1, n**2]和{}内。在这种情况下,最常见的情况是值d与任何if条件都不匹配,0在检查完所有条件后返回。为了加速,我们可以先检查d是否可能导致非零返回值,从而使它更快地失败。在d = abs(a - b)

if 1 < d < n - 1 or d > n: return 0 # Return 0 if d is not in [0, 1, n - 1, n]

elif d == 1: return 1 if min(a, b) % n else 0

elif d == n - 1: return 0 if max(a, b) % n else 1

else: return 1 if d == n else 6 # d == 0 case is moved to the last "else" since it is least frequently seen

7。使用查找表

进一步的加速可以通过使用查找表来实现。在这里,可以存储第一个条件检查的值[0, 1, n - 1, n],以加速检查。在这种情况下,有两个主要的选项:一组或一个长度-n+1布尔值列表。前者使用较少的内存,而后者具有更好的性能。注意,查找表应该在函数外部构造一次,然后传递给它。使用布尔列表作为查找的代码如下:def func(n, a, b, lookup):

d = abs(a - b)

if not (d <= n and lookup[d]): return 0

...

应用步骤6和7(使用布尔列表查找)将运行时间再减少15%。

注意,在这个例子中,2D查找表(实现为嵌套列表或字典)也可以使用(min(a, b) % n, d)作为索引来应用。然而,在步骤6中相同的输入分布假设下,这比1D查找稍慢,因为额外一级索引的开销。在

上面的运行时是将函数应用于[1, n**2]中所有可能的(a, b)值的总时间。在

python中if elif语句优化_在Python中优化ifelif表达式相关推荐

  1. python中if else语句用法_讲解Python中if语句的嵌套用法

    可能有这样一种情况,当你想检查其他条件后一个条件解析为真.在这种情况下,可以使用嵌套的if结构. 在嵌套的 if 语句结构,可以在一个 if... elif... else 结构里面可有另外一个 if ...

  2. python中for循环语句格式_关于Python中的for循环控制语句

    #第一个:求 50 - 100 之间的质数 import math for i in range(50, 100 + 1): for j in range(2, int(math.sqrt(i)) + ...

  3. python表示复数的语句是_在python中复数如何表示

    在python中复数如何表示 发布时间:2020-09-22 13:54:01 来源:亿速云 阅读:75 作者:小新 这篇文章主要介绍了在python中复数如何表示,具有一定借鉴价值,需要的朋友可以参 ...

  4. 下列选项中不属于python语言基本控制结构的是_下列选项中,不属于Python语言特点的是...

    [简答题]这个三个按钮分别表示什么?分别用图1 是?,图2是?图3是? [判断题]金属从液态转变为固态晶体的过程称为结晶. [多选题]简化的 Fe - Fe 3 C状态图上的 S 点是共析点,该点的温 ...

  5. python中的elif语句怎么运行_Python的elif语句怎么用

    else和elif语句也可以叫做子句,因为它们不能独立使用,两者都是出现在if.for.while语句内部的.else子句可以增加一种选择:而elif 子句则是需要检查更多条件时会被使用,与if和el ...

  6. python elif报错_python中的elif语句报错是什么原因

    else和elif语句也可以叫做子句,因为它们不能独立使用,两者都是出现在if.for.while语句内部的.else子句可以增加一种选择:而elif子句则是需要检查更多条件时会被使用,与if和els ...

  7. python中的与或非_「Python基础」 While 循环语句

    Python 编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务.其基本形式为: while 判断条件: 执行语句-- 执行语句可以是单个语句或语句 ...

  8. 关于python赋值语句下列选项中描述正确的是_关于 Python 语句 P = –P,以下选项中描述正确的是________...

    [单选题]以下选项中,哪一个是Python语言中代码注释使用的符号?________ [简答题]身份认同是对自身的认知,当你对"我是谁"有个清晰的概念时,你就能对将来想要的生活有个 ...

  9. python try语句例题_在Python中,一个try语句只能和一个except语句搭配。_学小易找答案...

    [单选题]言语和语言不同,言语是_____. [填空题]901x28= [判断题]在Python中,类中定义的类的成员(属性)或类方法,默认情况下都为公有的. [单选题]Outlines can be ...

  10. python常见的控制流结构有_【Python】控制流语句、函数、模块、数据结构

    1.三种控制流语句:if\for\while 2.每句后都要加冒号 3.有elif语句=else后加一个if 注意使用变量名! 注意缩进! 注意控制流语句后面要加冒号! 4.for i in rang ...

最新文章

  1. 实用手册|史上最全的Pycharm快捷键操作
  2. Reflection,Regular Expression,Threading,IO,AppDomain,Web Service/Remoting Service,ORM
  3. the enigma x64_【一期】什么是x64、x86,它们有什么区别?
  4. 效率达CPU一万倍、内含800万神经元:英特尔发布神经形态芯片超算
  5. Linux 之八 完整嵌入式 Linux 环境、(交叉)编译工具链、CPU 体系架构、嵌入式系统构建工具
  6. 基础网络爬虫(Web crawler)相关技术浅析
  7. servlet跳转页面的几种方法
  8. php mysql 作业计划,关于php:我需要使用cron作业每30分钟恢复一次数据库(mysql)
  9. 生成式模型与判别式模型—大厂笔试汇总
  10. mysql 去重计算公式_mysql多字段去重,并计数
  11. SSM-水果商城-导入项目-学习-2
  12. Linux的slab和nginx的区别,nginx中slab机制理解
  13. U盘插入电脑说要格式化,但电脑又说“磁盘被写保护,无法格式化”,如何解决
  14. SIFT(Scale Invariant Feature Transform) 算法小结及实验
  15. 从初级晋级高级UI设计师学习路线+全套视频
  16. zabbix 5.0监控客户端
  17. [Power Query] 删除重复项
  18. 数学之美读书感悟01
  19. Web Confidential for mac(密码信息管理软件)
  20. IT人的学习方法论-2,讨论学习的误区

热门文章

  1. C++中有符号与无符号
  2. 远程工具jump desktop mac 破解版
  3. Busybox 安装
  4. texstudio设置外部PDF失败的原因
  5. c语言中null未声明,错误:此范围内未声明“NULL”(示例代码)
  6. 山东建筑安全员A证怎么考多选题库
  7. c语言中int的取值范围是怎么算出来的,C语言中int的取值范围是怎么算出来的
  8. 30分钟带你入门Oracle
  9. java map equals_Java HashMap equals()方法
  10. HTML5的popstate、pushState、replaceState如何玩转浏览器历史记录