我有 Ubuntu 14.04 和安装了英特尔的数学内核库 (MKL) 的“Anaconda”Python 发行版。我的处理器是具有 8 个内核且没有超线程(因此只有 8 个线程)的 Intel Xeon。
对我来说,numpytensordot
始终优于einsum
大型数组。然而,其他人发现两者之间的差异很小,甚至einsum 在某些操作中可能优于 numpy。
对于使用numpy
快速库构建的发行版的人,我想知道为什么会发生这种情况。MKL 在非英特尔处理器上运行是否更慢?还是einsum
在具有更好线程能力的更现代的英特尔处理器上运行得更快?
这是一个快速示例代码,用于比较我的机器上的性能:
In [27]: a = rand(100,1000,2000)
In [28]: b = rand(50,1000,2000)
In [29]: time cten = tensordot(a, b, axes=[(1,2),(1,2)])
CPU times: user 7.85 s, sys: 29.4 ms, total: 7.88 s
Wall time: 1.08 s
In [30]: "FLOPS TENSORDOT: {}.".format(cten.size * 1000 * 2000 / 1.08)
Out [30]: 'FLOPS TENSORDOT: 9259259259.26.'
In [31]: time cein = einsum('ijk,ljk->il', a, b)
CPU times: user 42.3 s, sys: 7.58 ms, total: 42.3 s
Wall time: 42.4 s
In [32]: "FLOPS EINSUM: {}.".format(cein.size * 1000 * 2000 / 42.4)
Out [32]: 'FLOPS EINSUM: 235849056.604.'
使用 tensordot 的张量运算始终在 5-20 GFLOP 范围内运行。我用 einsum 只能得到 0.2 GFLOPS。