Python中Numpy和Math常用函数性能对比
numpy是如今数据分析领域离不开的Python第三方工具库,它和Python自带的math库中都有一些基础的数学函数,比如指数、对数、三角函数等。在需要使用这些函数的时候,到底该用numpy还是math,这个问题确实困扰了很多人。实现同样的功能,不同库中的函数,当然是要选择性能好的。
对于numpy和math的常见几个函数,我们用代码简单测试了一下性能,代码和结果如下:
(测试用Python版本为3.8.3,numpy版本为1.18.3)
1. log函数测试
N = 200000
f = 1.5
t0 = time.time()
for a in range(1, N):
np.log(a)
np.log(f)
t1 = time.time()
for a in range(1, N):
math.log(a)
math.log(f)
t2 = time.time()
print("Numpy log time: ", t1 - t0)
print("math log time: ", t2 - t1)
测试结果:
Numpy log time: 0.32114124298095703
math log time: 0.05388379096984863
经过200000次的重复计算,我们发现math库中的log函数所需时间是numpy的1/6左右,也就是说math在单数值计算的性能大概是numpy的6倍。
2. 三角函数测试
以cos作为测试案例:
f = 1.5
t0 = time.time()
for a in range(1, N):
np.cos(a)
np.cos(f)
t1 = time.time()
for a in range(1, N):
math.cos(a)
math.cos(f)
t2 = time.time()
print("\nNumpy cos time: ", t1 - t0)
print("math cos time: ", t2 - t1)
测试结果:
Numpy cos time: 0.29618000984191895
math cos time: 0.051862239837646484
依然是200000次的重复计算,math的性能是numpy的5.71倍。
3. exp函数测试
f = 1.5
d=5
t0 = time.time()
for a in range(1, N):
np.exp(d)
np.exp(f)
t1 = time.time()
for a in range(1, N):
math.exp(d)
math.exp(f)
t2 = time.time()
print("\nNumpy exp time: ", t1 - t0)
print("math exp time: ", t2 - t1)
测试结果:
Numpy exp time: 0.2932150363922119
math exp time: 0.048870086669921875
math的性能依然是numpy的6倍。
4. 平方根sqrt测试
f = 1.5
d=5
t0 = time.time()
for a in range(1, N):
np.sqrt(a)
np.sqrt(f)
t1 = time.time()
for a in range(1, N):
math.sqrt(a)
math.sqrt(f)
t2 = time.time()
print("\nNumpy sqrt time: ", t1 - t0)
print("math sqrt time: ", t2 - t1)
测试结果:
Numpy sqrt time: 0.30121898651123047
math sqrt time: 0.04785966873168945
math的性能大约是numpy的6.3倍。
对几个典型函数的测试可以看出,math的性能要明显优于numpy同等函数的功能。因此,对于单数值的计算在选择库函数的时候,应当优先选择Python自带的math库中的函数。