我最近发现了 Numexpr 中的一个错误。虽然我已经在他们的 Git hub 上打开了一个问题,但我想我也会在这里利用集体智慧。
简而言之,evaluate
有时(不可预测地)在执行简单的数组操作时会返回不正确的结果。该错误可以通过下面的 Python 代码重现,导致返回零数组而不是正确的结果。虽然示例代码显示了一个乘法,但这个错误在加法和幂运算中也表现出来了。值得注意的是,Numexpr 没有引发错误或警告,计算负载看起来正常(即,在监视任务管理器时,RAM 和 CPU 已按预期征税),并且返回了正确的形状数组。由于这些原因,隔离是一个相当隐蔽的错误!在我们的测试中,此错误仅在以下硬件版本中出现:
- Windows Server 2012 r2,Intel Xeon 2680 v3,2 个处理器,48 个逻辑内核
- Windows 8.1,Intel Xeon 2690,1 个处理器,24 个逻辑内核
在我们的 Windows 7、64 位、Intel i7 机器上完成的数千次软件运行中,这从未体现出来。此外,我们已经多次运行附加代码(使用更大的数组和更多的迭代)并且在 Windows 7、i7 机器上没有看到错误。但是,至强计算机会定期显示它。不幸的是,我们没有任何其他构建可以测试。
其他注意事项:
- 我们从 WinPython 发行版 3.4.3.6 运行。
- 我们没有调用任何支持的 Numexpr 函数,只是
evaluate
......所以我们使用它的默认设置。 - Numexpr 的版本是 2.4.4,包含在 WinPython 3.4.3.6 中
示例代码:
import numpy as np
import numexpr as ne
x = np.ones(1e6)
y = np.ones(1e6)
for ii in range(1000):
rr = ne.evaluate('x * y')
test = np.all(rr == 0)
if test:
print('Gotcha! %d' % ii)
print('Complete!')