是否缓冲了numpy-matrix-functions?

时间:2017-01-17 15:01:30

标签: python numpy optimization

numpy矩阵特定函数,例如x.max()多次应用时会缓冲吗?

所以应该写一下:

bincount=np.apply_along_axis(lambda x: np.bincount(x, minlength=data.max()+1), axis=0, arr=data)

或更好

data_max=data.max()+1
bincount=np.apply_along_axis(lambda x: np.bincount(x, minlength=data_max), axis=0, arr=data)

数据就是这样。

data=np.array([[1,2,5,4,8,7,8,9,14,8,14,5,2,1],
               [5,8,7,13,7,8,9,21,5,7,9,24,3,2]])

当然甚至更大

2 个答案:

答案 0 :(得分:2)

更新问题后,您似乎在询问numpy是否实现了某些形式的缓存的结果。虽然对此问题没有一般性的回答,但对于像ndarray.max这样的方法,很明显没有进行缓存。

我们怎么知道不看实施?考虑一个缓存方案必须解决两个问题:

  • 找到存储缓存结果的地方;
  • 有一个策略,一旦不再适用,就会使缓存失效。

虽然第一个问题不重要,但第二个问题是真正的杀手。不仅可以随时更改numpy数组,而且可以由许多对象共享数组的内容。此外,C代码可以获取内部缓冲区的地址,并对底层内存实现自己的修改。缓存结果将有效地禁用numpy的许多有趣用法。

您可以将numpy视为一个低级别的库,它不关心这种性质的优化。如果需要缓存,则应在更高级别实现,如第二个示例所示。

答案 1 :(得分:0)

像Slater Tyranus所指出的那样,只有一个替补球员才会显示任何结果:

min(timeit.Timer('func_a(data)', setup=setup).repeat(100,100))
  

min(timeit.Timer('func_b(data)', setup=setup).repeat(100,100))

     

0.02922797203063965

     

data_max=data.max()

     

0.018524169921875

我还测试了更大的数据。总的来说,可以说,它之前回报计算<asset:javascript src="myJSFile.js"/>。对于更大的阵列,差异变得更大。