python列表底层实现原理_python pow函数底层实现原理

本文探讨了Python中`pow(a, b)`和`a**b`两种求幂次的方法,通过时间对比发现它们在性能上相似,并非通过简单的循环相乘实现。接着分析了一个高效的幂运算实现方式,通过位运算和结果复用减少重复计算。最后,自定义了一个类似`pow`的函数`fun(a, b)`,并验证其运行时间与内置`pow`接近,证实了底层可能采用了类似优化策略。" 82879834,7751157,B树与B+树详解,"['数据结构', '数据库理论', '算法', '存储系统']
摘要由CSDN通过智能技术生成

#一、最朴素的方法和pow比较 python中求两个a的b次方,常见的方法有:pow(a,b),a**b。那么这两个是否有区别,而且他们底层是怎么实现的呢? 最容易想到的方法就是:循环b次,每次都乘以a。但是究竟底层是不是这样实现的呢? 下面先从时间上来判断他们之间的关系。

首先来看看,pow和**有没有区别:

import time

start = time.time()

print(2 ** 1000000)

end0 = time.time()

print('**:', end0 - start)

print(pow(2, 1000000))

end1 = time.time()

print('pow:', end1 - end0)

上面的结果输出如下:

2b5001c6c5d4a5e97fcf4e6effaaf85c.png 2的100万次方,两者所用时间是基本一样的,所以他们应该本质上应该使用了相同的算法

下面再来看看用for循环模拟的结果

import time

start = time.time()

print(2 ** 1000000)

end0 = time.time()

print('**:', end0 - start)

print(pow(2, 1000000))

end1 = time.time()

print('pow:', end1 - end0)

r = 1

for i in range(1000000):

r *= 2

end2 = time.time()

print('for:', end2 - end1)

上面的输入结果如下:

6990edc57ca405993fc4477993d9fbc0.png 非常恐怖的对比,pow和**都只用了1.5秒,而for循环用来20秒!,所以可以肯定的是,pow底层绝对不是用循环去求解的

#pow底层实现 我们分析一下为什么直接循环相乘效率会这么低,我们其实不难发现里面有大量的重复运算,比如我们算出22后面,还不断重复着计算22的结果,所以我们只要保存这些中间必要的计算结果后你不断重复利用就可以大大减少运算量。举个例子,比如我们现在在计算2的9次方,我们可以这样子计算,先算出22然后不断利用这个结果: (22)(22)(22)(22)2 即44442 只要计算5次 同理可以再利用上面的44 可以的16162

具体实现程序如下:

def fun(a, b):

r = 1

while b > 1:

if b & 1 == 1: #与运算一般可以用于取某位数,这里就是取最后一位。

r *= a

a *= a

b = b >> 1 #这里等价于b//=2

return r * a

接下我们来看看,究竟pow函数底层是不是这样实现的

import time

start = time.time()

print(2 ** 1000000)

end0 = time.time()

print('**:', end0 - start)

print(pow(2, 1000000))

end1 = time.time()

print('pow:', end1 - end0)

r = 1

for i in range(1000000):

r *= 2

end2 = time.time()

print('for:', end2 - end1)

print(fun(2, 1000000))

print('fun:', time.time() - end2)

bf0cf62b3c1c281d18c5174e70cab2b6.png 从上面可以看出来,pow函数运行的时间基本和自定义的函数一致,甚至自定制的还更快! 解析完毕!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值