Python是一种解释型的语言,本身的计算性能并不高。但是Python已经发展成为了一种访问高性能技术的理想平台,不同库的使用将大大影响运算的速度。
下面就各种计算库的计算速度做一个简单的测试:
一、math库的计算
from math
import *
from time
import ctime
import timeit
loops =
25000000
a =
range(
1, loops)
def
f(
x):
return
3 * log(x) + cos(x) **
2
def
calc():
[f(x)
for x
in a]
print(ctime())
# calc共执行5次,花费90秒,平均每一次花费18秒的时间。
t = timeit.Timer(
lambda: calc()).timeit(
5)
print(t)
print(ctime())
二、使用numpy库
import numpy
as np
from time
import ctime
import timeit
loops =
25000000
a = np.arange(
1, loops)
def
calc():
#执行2500万次计算
3 * np.log(a) + np.cos(a) **
2
print(ctime())
# calc共执行5次,花费6.5秒,平均每一次花费1.3秒的时间。
t = timeit.Timer(
lambda: calc()).timeit(
5)
print(t)
print(ctime())
三、numexpr库的使用
import numexpr
as ne
import numpy
as np
from time
import ctime
import timeit
loops =
25000000
a = np.arange(
1, loops)
def
calc():
#执行2500万次计算
expr =
"3 * log(a) + cos(a) ** 2"
ne.evaluate(expr)
print(ctime())
# calc共执行5次,花费1.6秒,平均每一次花费0.32秒的时间。
t = timeit.Timer(
lambda: calc()).timeit(
5)
print(t)
print(ctime())
四、numexpr使用多线程
import numexpr
as ne
import numpy
as np
from time
import ctime
import timeit
loops =
25000000
a = np.arange(
1, loops)
def
calc():
#执行2500万次计算
expr =
"3 * log(a) + cos(a) ** 2"
ne.evaluate(expr)
#设置多线程使用。
ne.set_num_threads(
4)
print(ctime())
# calc共执行5次,花费1.6秒,平均每一次花费0.32秒的时间。
t = timeit.Timer(
lambda: calc()).timeit(
5)
print(t)
print(ctime())
看来不占优势。
如果将ne.set_num_threads(4)修改为ne.set_num_threads(8),即使用8线程,可以降到0.23秒。
备注:从上面的测试可以看出,numpy的性能很不错,numexpr没有压倒性的优势。