概述
用python,比较pow的实现算法
思路
主要对比递归和while循环。PowCircle2函数和PowCircle类似,PowCircle2更容易理解一些。
源码
from time import ctime
from math import *
def PowRecursion(x,y):
if(y==0):
return 1
if(y==1):
return x
t = PowRecursion(x, (int)(y / 2))
if y&1 == 1:
return x * t * t
else:
return t * t
def PowCircle(x,y):
r=1
if(y&1 == 1):
r=x
y=y-1
y = y>>1
while y>0:
x = x*x
y = y >> 1
return r*x
def PowCircle2(x,y):
r=1
if(y&1 == 1):
r=x
y=y-1
i=2
while i<y:
x = x*x
i = i*2
return r*x
def PowInternet(a, b):
r = 1
while b > 1:
if b & 1 == 1: #与运算一般可以用于取某位数,这里就是取最后一位。
r *= a
a *= a
b = b >> 1 #这里等价于b//=2
return r * a
X = 9
Y = 9
COUNT= 5000000
def main_recursion():
print('%s main_recursion start' % ctime())
for i in range(COUNT):
PowRecursion(X, Y)
print('%s main_recursion end\n' % ctime())
def main_pow():
print('%s main_pow start' % ctime())
for i in range(COUNT):
pow(X, Y)
print('%s main_pow end\n' % ctime())
def main_circle():
print('%s main_circle start' % ctime())
for i in range(COUNT):
PowCircle(X, Y)
print('%s main_circle end\n' % ctime())
def main_circle2():
print('%s main_circle2 start' % ctime())
for i in range(COUNT):
PowCircle2(X, Y)
print('%s main_circle2 end\n' % ctime())
def main_internet():
print('%s main_internet start' % ctime())
for i in range(COUNT):
PowInternet(X, Y)
print('%s main_internet end\n' % ctime())
if __name__=='__main__':
print('PowRecursion(X, Y)',PowRecursion(X, Y))
print('pow(X, Y)', pow(X, Y))
print('PowCircle(X, Y)', PowCircle(X, Y))
print('PowCircle2(X, Y)', PowCircle2(X, Y))
print('PowInternet(X, Y)', PowInternet(X, Y))
main_recursion()
main_pow()
main_circle()
main_circle2()
main_internet()
运行结果
PowRecursion(X, Y) 387420489
pow(X, Y) 387420489.0
PowCircle(X, Y) 387420489
PowCircle2(X, Y) 59049
PowInternet(X, Y) 387420489
Fri Sep 11 17:31:39 2020 main_recursion start
Fri Sep 11 17:31:46 2020 main_recursion end
Fri Sep 11 17:31:46 2020 main_pow start
Fri Sep 11 17:31:47 2020 main_pow end
Fri Sep 11 17:31:47 2020 main_circle start
Fri Sep 11 17:31:50 2020 main_circle end
Fri Sep 11 17:31:50 2020 main_circle2 start
Fri Sep 11 17:31:52 2020 main_circle2 end
Fri Sep 11 17:31:52 2020 main_internet start
Fri Sep 11 17:31:56 2020 main_internet end
后记
1、递归的函数调用要消耗时间,比while要慢
2、python内部的pow接口最快,待进一步研究?!