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

 更新时间:2021年03月12日 09:38:01   作者:哟,写bug呢??  
这篇文章主要介绍了python pow函数的底层实现原理介绍,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

一、最朴素的方法和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 时间上可以与“快速幂取模算法” 相媲美!

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

相关文章

  • Selenium控制浏览器常见操作示例

    Selenium控制浏览器常见操作示例

    这篇文章主要介绍了Selenium控制浏览器常见操作,结合实例形式分析了Selenium针对浏览器的窗口大小控制、前进、后退、刷新、截屏等相关操作技巧,需要的朋友可以参考下
    2018-08-08
  • 详解让Python性能起飞的15个技巧

    详解让Python性能起飞的15个技巧

    Python 一直以来被大家所诟病的一点就是执行速度慢,但不可否认的是 Python 依然是我们学习和工作中的一大利器。本文总结了15个tips有助于提升 Python 执行速度、优化性能,需要的可以参考一下
    2022-02-02
  • python实现雨滴下落到地面效果

    python实现雨滴下落到地面效果

    这篇文章主要为大家详细介绍了python实现雨滴下落到地面效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • Python3实现捕获Ctrl+C终止信号

    Python3实现捕获Ctrl+C终止信号

    这篇文章主要为大家详细介绍了如何利用Python3实现捕获Ctrl+C终止信号的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-03-03
  • Python Tkinter模块 GUI 可视化实例

    Python Tkinter模块 GUI 可视化实例

    今天小编就为大家分享一篇Python Tkinter模块 GUI 可视化实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • Python算法输出1-9数组形成的结果为100的所有运算式

    Python算法输出1-9数组形成的结果为100的所有运算式

    这篇文章主要介绍了Python算法输出1-9数组形成的结果为100的所有运算式,然后介绍了另外一个相关实例,具体内容请参阅正文,需要的朋友可以参考下。
    2017-11-11
  • 使用Python打造一款间谍程序的流程分析

    使用Python打造一款间谍程序的流程分析

    这篇文章主要介绍了使用Python打造一款间谍程序,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • Pandas中两个dataframe的交集和差集的示例代码

    Pandas中两个dataframe的交集和差集的示例代码

    这篇文章主要介绍了Pandas中两个dataframe的交集和差集的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 使用Python读写csv文件

    使用Python读写csv文件

    大家好,本篇文章主要讲的是使用Python读写csv文件,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • 关于AnacondaNavigator Jupyter Notebook更换Python内核的问题

    关于AnacondaNavigator Jupyter Notebook更换Python内核的问题

    因为新安装的Anaconda Navigator默认安装了一个Python,Jupyter Notebook默认使用的内核就是这个Python,跟我系统安装好的Python冲突了,下面小编给大家介绍AnacondaNavigator Jupyter Notebook更换Python内核的问题,需要的朋友可以参考下
    2022-02-02

最新评论