使用 numexpr.evaluate(( 的目的是加快计算速度。但就我而言,它甚至比 numpy und eval(( 慢。我想知道为什么?
代码作为示例:
import datetime
import numpy as np
import numexpr as ne
expr = '11808000.0*1j*x**2*exp(2.5e-10*1j*x) + 1512000.0*1j*x**2*exp(5.0e-10*1j*x)'
# use eval
start_eval = datetime.datetime.now()
namespace = dict(x=np.array([m+3j for m in range(1, 1001)]), exp=np.exp)
result_eval = eval(expr, namespace)
end_eval = datetime.datetime.now()
# print(result)
print("time by using eval : %s" % (end_eval- start_eval))
# use numexpr
# ne.set_num_threads(8)
start_ne = datetime.datetime.now()
x = np.array([n+3j for n in range(1, 1001)])
result_ne = ne.evaluate(expr)
end_ne = datetime.datetime.now()
# print(result_ne)
print("time by using numexpr: %s" % (end_ne- start_ne))
返回: 使用评估时间:0:00:00.002998
使用 numexpr 的时间:__ 0:00:00.052969
谢谢大家
我从 Github 中的 robbmcleod 那里得到了答案
对于 NumExpr 2.6,您需要大约 128 - 256 kElements 的数组才能看到加速。NumPy总是启动得更快,因为它不必在线程屏障处同步,否则就会启动虚拟机
此外,一旦你第二次调用numexpr.evaluate((,它应该会更快,因为它已经编译了所有内容。对于简单表达式,编译大约需要 0.5 毫秒,对于较长的表达式,编译时间更长。表达式存储为哈希,因此下次计算费用消失时。
相关网址: https://github.com/pydata/numexpr/issues/301#issuecomment-388097698