Python 3.X: почему numberxpr.evaluate () медленнее, чем eval ()? - PullRequest
0 голосов
/ 10 мая 2018

Целью использования figurexpr.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

время с помощью числаxpr: __ 0: 00: 00.052969

1 Ответ

0 голосов
/ 10 мая 2018

Спасибо всем

Я получил ответ от robbmcleod в Github

для NumExpr 2.6 вам понадобятся массивы около 128 - 256 kElements, чтобы увидеть ускорение. NumPy всегда запускается быстрее, поскольку ему не нужно синхронизироваться с барьером потока и, в противном случае, раскручивать виртуальную машину

Кроме того, после того, как вы вызовете Numberxpr.evaluate () во второй раз, он должен быть быстрее, так как он уже все скомпилировал. Компиляция занимает около 0,5 мс для простых выражений, больше для более длинных выражений. Выражение сохраняется в виде хэша, поэтому в следующий раз вычислительные затраты исчезнут.

связанный URL: https://github.com/pydata/numexpr/issues/301#issuecomment-388097698

...