在Python可以使用两个方式求次方,双星号和math.pow() 我们下面可以使用代码进行测试,这里测试的是5的6次幂
import math
import time
import matplotlib.pyplot as plt
ls=[(i+1)*10000 for i in range(1000)]
print('start **')
res_x=[]
for i in ls[:]:
start = time.time()
for j in range(i):
5 ** 6
print('** spend time is {}'.format(time.time() - start))
res_x.append(time.time() - start)
print('start math.pow')
res_y=[]
for i in ls[:]:
start = time.time()
for j in range(i):
math.pow(5,6)
print('math.pow spend time is {}'.format(time.time() - start))
res_y.append(time.time() - start)
plt.plot(ls[:],res_x,"ob-",label="**")
plt.legend()
plt.xlabel("x")
plt.ylabel(" spend time(s)")
plt.plot(ls[:],res_y,"or-",label="math.pow")
plt.legend()
plt.xlabel("x")
plt.ylabel("spend time(s)")
plt.show()
运行的结果如下:
我们可以看到,math实际上在调用十分频繁后,速度比双星号差很多倍,越频繁差距越大,而双星号随着频繁调用的增加变化不大
我们知道,次方的计算不仅仅和调用次数有关,还是多少次幂有一定的关系,接下来我们就实验一下:
import math
import time
import matplotlib.pyplot as plt
ls=[(i+1)*10000 for i in range(1000)]
print('start **')
res_x=[]
for i in ls[:]:
start = time.time()
5**i
print('** spend time is {}'.format(time.time() - start))
res_x.append(time.time() - start)
# print('start math.pow')
# res_y=[]
# for i in ls[:]:
# start = time.time()
# math.pow(5,i)
# print('math.pow spend time is {}'.format(time.time() - start))
# res_y.append(time.time() - start)
plt.plot(ls[:],res_x,"ob-",label="**")
plt.legend()
plt.xlabel("x")
plt.ylabel(" spend time(s)")
# plt.plot(ls[:],res_y,"or-",label="math.pow")
# plt.legend()
# plt.xlabel("x")
# plt.ylabel("spend time(s)")
plt.show()
结果如下:
可以从上图发现,次数增加运算时间会增加很多,比起调用次数来说,也是呈现递增的趋势。
而且发现math.pow在次数稍微大一些就会报错:
math.pow(5,i) OverflowError: math range error
所以综合来说,math.pow的实用性不如双*,而且就算是双*的幂次也不要过大,特别影响效率