首页 > 解决方案 > Python 3.X:为什么 numexpr.evaluate() 比 eval() 慢?

问题描述

使用 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))

返回:使用 eval 的时间:0:00:00.002998

使用 numexpr 的时间:__ 0:00:00.052969

标签: pythonnumpyscipyevalnumexpr

解决方案


谢谢你们

我从 Github 的 robbmcleod 得到了答案

对于 NumExpr 2.6,您需要大约 128 - 256 kElements 的数组才能看到加速。NumPy 总是启动得更快,因为它不必在线程屏障处同步,否则会启动虚拟机

此外,一旦您第二次调用 numexpr.evaluate() ,它应该会更快,因为它已经编译了所有内容。对于简单的表达式,编译大约需要 0.5 ms,对于较长的表达式则需要更多时间。该表达式存储为散列,因此下次计算费用消失了。

相关网址:https ://github.com/pydata/numexpr/issues/301#issuecomment-388097698


推荐阅读