Python 3.X:为什么 numexpr.evaluate() 比 eval() 慢?

Python 3.X: Why numexpr.evaluate() slower than eval()?

使用numexpr.evaluate() 的目的是加快计算速度。但就我而言,它的工作速度甚至比 numpy 和 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))

return: 使用 eval 的时间:0:00:00.002998

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

谢谢大家

我在 Github

中从 robbmcleod 那里得到了答案

for NumExpr 2.6 you'll need arrays around 128 - 256 kElements to see a speed-up. NumPy always starts faster as it doesn't have to synchronize at a thread barrier and otherwise spin-up the virtual machine

Also, once you call numexpr.evaluate() the second time, it should be faster as it will have already compiled everything. Compilation takes around 0.5 ms for simple expressions, more for longer expressions. The expression is stored as a hash, so the next time that computational expense is gone.

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