for+if语句 和 仅用if语句 的程序效率

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了for+if语句 和 仅用if语句 的程序效率相关的知识,希望对你有一定的参考价值。

比如我先定义了一维数组以及变量max:
int number[10],int max;
假设number[0]~number[9]已经赋值,
max=number[0];
现欲求出10个数的最大值,可以使用for+if语句:
for (int i=1;i<10;i++)
if(max<number[i])max=number[i];

或者仅使用9个if语句:
if (max<number[1])
max=number[1];

if (max<number[2])
max=number[2];

……(省略)
if (max<number[9])
max=number[9];

请问上述两种方法,哪一种程序效率较高?为什么?

以下为在VC++6.0环境下对程序效率(时间,空间)分析的过程和结论:
1 程序代码
#include "stdafx.h"
#include <stdio.h>
int main()

int number[10] =1212,1212,1,2,4,5,6,7,8,999999;
int max;
max=number[0];

for(int i=1;i<10;i++)

if(max<number[i])

max=number[i];



if (max<number[1])

max=number[1];


if (max<number[2])

max=number[2];


if (max<number[3])

max=number[3];


if (max<number[4])

max=number[4];

if (max<number[5])

max=number[5];

if (max<number[6])

max=number[6];

if (max<number[7])

max=number[7];

if (max<number[8])

max=number[8];

if (max<number[9])

max=number[9];


return 0;


2 问题提出:

上面程序代码查找10个数中的最大值,分别使用for +if语句,和9个单独的if语句,请问上述两种方法,
哪一种程序效率较高?为什么?

3 分析
3.1 for+if语句的反汇编代码
13: for(int i=1;i<10;i++)
00401074 mov dword ptr [ebp-30h],1
0040107B jmp main+76h (00401086)
0040107D mov ecx,dword ptr [ebp-30h]
00401080 add ecx,1
00401083 mov dword ptr [ebp-30h],ecx
00401086 cmp dword ptr [ebp-30h],0Ah
0040108A jge main+94h (004010a4)
14:
15: if(max<number[i])
0040108C mov edx,dword ptr [ebp-30h]
0040108F mov eax,dword ptr [ebp-2Ch]
00401092 cmp eax,dword ptr [ebp+edx*4-28h]
00401096 jge main+92h (004010a2)
16:
17: max=number[i];
00401098 mov ecx,dword ptr [ebp-30h]
0040109B mov edx,dword ptr [ebp+ecx*4-28h]
0040109F mov dword ptr [ebp-2Ch],edx
18:
19:
004010A2 jmp main+6Dh (0040107d)

3.2 独立的9个if语句的反汇编代码(以第一个if语句为例)
22: if (max<number[1])
004010A4 mov eax,dword ptr [ebp-2Ch]
004010A7 cmp eax,dword ptr [ebp-24h]
004010AA jge main+0A2h (004010b2)
23:
24: max=number[1];
004010AC mov ecx,dword ptr [ebp-24h]
004010AF mov dword ptr [ebp-2Ch],ecx
25:
3.3 分析:
1)使用for + if ,每次循环需要执行13个汇编代码,循环代码最大可能执行:9 * 13 = 117条指令;
2)使用独立if语句,每次执行5条判断语句,9个if代码判断最大执行代码量为9 * 5 = 45 条指令;
程序效率分析(运行时间和占用内存空间的分析)因此从程序时间效率上分析,2)的时间效率会比较高。但从空间
上分析,1)的效率会比较高,循环执行一共使用15条指令;2)的效率不高(45条指令空间)。
实际的编程使用建议 :一般实际使用1)方法的话,代码会比较容易维护,2)在实际应用中显得不是很专业的做法!
参考技术A 两种算法的程序效率应该相当的吧,时间复杂度都为O(10)

纠正一个错误:定义变量
int number[10],int max;
要么把逗号改成分号,要么就把int去掉

希望回答对你有帮助。
参考技术B 用9个if的效率高,但是用for语句比较简洁,易修改。
原因很明显,for循环里同样做了9次比较和赋值,但是还多出了9次对i的赋值和比较操作。
其实不必计较这个的,基本没人会用9个if
参考技术C 这个 最坏情况下都是常量时间 O(1)
所以是一样的
假设有n步
for 循环和if 都是 O(n) 所以 比这个是没意义的
这个for 能循环n次 if你能复制n次吗???
参考技术D for高,CPU会把for的循环块放进cache再进行运算。如果你的if语句太长甚至都不能整个的放进去。

Python基础语法—— 条件语句(if)+循环语句(for+while)

文章目录


条件语句

if - else

Python中的 if-else 语法格式

if 条件1:
	条件1满足执行的语句
elif 条件2:
	条件2满足执行的语句
else:
	条件12都不满足执行的语句
必定执行的语句

注意:Python的条件语句的写法和很多编程语言不太一样

  • if 后面的条件表达式没有(),使用:作为结尾
  • if/else命中条件后要执行的语句块,使用4个空格或者Tab进行缩进,并没有使用花括号这么一说
  • 对于多分支语句,写作 elif

示例

tmp = input("你要好好学习请输入 1,你要天天摆烂请输入 2 ——> ")
if tmp == '1':
    print('好好学习你可以找一份好工作')
elif tmp == '2':
    print('天天摆烂可能就不好找工作')
else:
    print('输入错误')

if嵌套

num1 = int(input('请输入第一个数字:'))
num2 = int(input('请输入第二个数字:'))

if num1 < 10:
    if num2 < 10:
        print('你输入的是个位数')
else:
    print('你输入的不是个位数')

判断闰年

year = int(input('请输入一个年份: '))
if (year % 400 == 0) or (year % 4 == 0 and year % 100 != 0):
    print(f'year是闰年')
else:
    print(f'year不是闰年')

空语句 (pass)

有的时候我们希望条件满足的时候啥都不做,但Python对代码的缩进要求比较高,不能啥都不写,也不能写个注释。
错误示例:

age = input('请输入你的年龄')
if age != '18':
    #错误示例
else:
    print(f'你的年龄为age')

正确做法,加上 pass关键字

age = input('请输入你的年龄')
if age != '18':
    pass
else:
    print(f'你的年龄为age')

pass关键字表示空语句,并不会对程序的执行有任何影响,只是占一个位置

循环语句

while 循环

语法格式:

while 条件:
	循环体
  • 条件为真执行循环体
  • 条件为假结束循环

求 1!+2!+3!+n!

num = int(input('请输入一个数,求1!+到这个数的阶乘: '))
result = 0
count = 1
tmp = 1
while num >= count:
    result += tmp
    count += 1
    tmp *= count
print(result)


for循环

基本语法:

for 循环变量 in 可迭代对象
	循环体

注意:

  • Python的for循环和C/Java语言不同,没有“初始化语句”、“循环条件判定语句”、“循环变量更新语句”,而是变得更加简单
  • 所谓的“可迭代对象”,指的是内部包含多个元素,能一个一个把元素取出来的特殊变量

示例:

for i in range(1, 11):
    print(i, end=" ")

  • range函数,能够生成一个可迭代对象,生成的范围是 [1,11),也就是左闭右开的一个区间
  • end是表示每次打印后结尾加什么,默认是加个换行符**\\n**

range函数另一种写法

# 打印 2 4 6 8 10
for i in range(2, 11, 2):
    print(i, end=" ")

  • range第一个参数为开始数字
  • 第二个参数为结束数字
  • 第三个参数为步长,类似于 i+=2

同样步长还可以设定为负数

for i in range(10, 0, -1):
    print(i, end=" ")

continue&break

continue 表示结束这次循环, 进入下次循环

for i in range(1, 11):
    if i % 2 == 0:
        continue
    print(f'第i天')

break表示直接跳出单前循环

count = 0
result = 0
while True:
    tmp = input('请输入多个数字求和,输入;结束: ')
    if tmp == ';':
        break
    tmp = int(tmp)
    result += tmp
    count += 1
print(f'你一共输入了count个数字,它们的和为result')

循环嵌套
输出九九乘法表

for i in range(1, 10):
    for j in range(1, 10):
        print(f'i*j=i*j ', end='')
    print()


以上是关于for+if语句 和 仅用if语句 的程序效率的主要内容,如果未能解决你的问题,请参考以下文章

在C++中if语句和case语句哪一个执行效率更高

Python的 if .else.elif语句详解

C语言中的条件赋值语句和if——else语句执行效率比较,哪一个效率高些,坐等高手解惑

如何在 if 语句和 for 循环之外获取数组

高效的 if 语句 / for 循环

效率:switch 语句优于 if 语句