[Python]时间复杂度和空间复杂度

简介

在编写Python中的自定义函数或算法时,减低时间复杂度空间复杂度,会大大提升Python自定义函数或算法的整体性能,提升性能的几个书写好习惯

  • 尽量不要写循环,最好是一次就输出结果
  • 如果写循环,尽量写一层循环就能有结果
  • 避免嵌套

时间复杂度

时间复杂度是用来估计自定义函数或算法运行时间的一个式子(单位),时间复杂度常用“O”表述,而且时间复杂度可被称为是渐近的,它考察当输入值大小趋近 ∞ \infin 时的情况

时间复杂度为 O(1)的例子

print('Hello!')
print(1)

时间复杂度为 O(n)的例子

# 其中range(n) 换成range(length(n))或者直接换成n,其时间复杂度都为 O(n)
for i in range(n): 
    print('Hello!')

时间复杂度为O(n^2)的例子

# 其中range(n) 换成range(length(n))或者直接换成n,其时间复杂度都为 O(n^2)
for i in range(n):
    for j in range(n):
        print('Hello!')

for i in range(n): 
    print('Hello!')
    for j in range(n):
        print('Hello!')

for i in range(n): 
    for j in range(i):
        print('Hello!')

时间复杂度为O(n^3)的例子

# 其中range(n) 换成range(length(n))或者直接换成n,其时间复杂度都为 O(n^3)
for i in range(n):
    for j in range(n):
        for k in range(n):
            print('Hello!') 

由上述时间复杂度O(n)的变化可以得出这样的结论:O(n)中n的几次方取决于自定义函数或算法中存在几个循环

时间复杂度为O(n^n)的例子

# 其中range(n) 换成range(length(n))或者直接换成n,其时间复杂度都为 O(n^n)
for i in range(n):
    for j in range(n):
        for k in range(n):
        	for l in range(n):
        	.
        	.
        	.
        		for o in range(n):
            		print('Hello!') 

时间复杂度为O( l o g 2 n log_2n log2n)的例子

n = 128
while n > 1:
    print(n)
    n = n // 2 # //表示整除法

计算上述问题的时间复杂度步骤:

  1. 2 7 = 128 2^7 = 128 27=128
  2. l o g 2 128 = 7 log_2128 = 7 log2128=7
  3. 循环减半的时间复杂度为O( l o g 2 128 log_2128 log2128),即O( l o g n 128 log_n128 logn128) = O(7)

复杂度为O( l o g 2 n log_2n log2n)

n = n
while n > 1:
    print(n)
    n = n // 2 # //表示整除法

常见的时间复杂度高低排序:O(1)<O( l o g n log_n logn)<O(n)<O( n l o g n nlog_n nlogn)<O( n 2 n^2 n2)<O( n 2 l o g n n^2log_n n2logn)<O( n 3 n^3 n3)

空间复杂度

空间复杂度:用来评估自定义函数或算法内存占用大小

空间复杂度为 1的例子

p = 'Python'
l = 'like'
m = 'me'

空间复杂度为 n

p = [1,2,3,....,n]

空间复杂度为 n*n

p_n = [[1,2,3,....,n],[1,2,3,....,n],.....,[1,2,3,....,n]]

空间复杂度为 n * n * n

p_n = [[[1,2,3,....,n],[1,2,3,....,n],.....,[1,2,3,....,n]],
[[1,2,3,....,n],[1,2,3,....,n],.....,[1,2,3,....,n]],
....,
[[1,2,3,....,n],[1,2,3,....,n],.....,[1,2,3,....,n]]

空间复杂度却决于:

  • 变量的长度
  • 变量的个数
  • 变量的复杂程度

示例展示

自定义方差(variance)函数简化,以及计算其对应的时间复杂度和空间复杂度

def variance (*args): # *args不限定输入的可变量,这里输入的数量为n
    total = 0 #时间复杂度为 1;空间复杂度为 1
    average = float(sum(args))/len(args) 
    # 时间复杂度为 n+1 其中sum(args)为n,len(args)为 1
    # 空间复杂度为 1
    for val in args:
        total +=(val-average)**2
    # 时间复杂度为 n,即进行了n次循环
    # 空间复杂度为 n,即存储了n次total
    return total/len(args) # 时间复杂度为 1;空间复杂度为 1

时间复杂度:1+n+1+n+1 = 2n+1
空间复杂度:1+1+n+1 = n+3

  • 11
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AutismThyself

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值