文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python pow函数的底层实现原理介绍

2024-04-02 19:55

关注

一、最朴素的方法和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)

上面的结果输出如下:

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)

上面的输入结果如下:

非常恐怖的对比,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)

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

解析完毕!

补充:Python3 的pow函数用法 及效率

Python3自带pow函数:

1. pow(a,b) 表示求a的b次方 a^b

2.pow(a,b,c) 表示求a的b次方取余c a^b%c

然后 用pow函数求出来的 a^b%c 时间上可以与“快速幂取模算法” 相媲美!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。如有错误或未考虑完全的地方,望不吝赐教。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯