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]])
当然甚至更大
答案 0 :(得分:2)
更新问题后,您似乎在询问numpy是否实现了某些形式的缓存的结果。虽然对此问题没有一般性的回答,但对于像ndarray.max
这样的方法,很明显没有进行缓存。
我们怎么知道不看实施?考虑一个缓存方案必须解决两个问题:
虽然第一个问题不重要,但第二个问题是真正的杀手。不仅可以随时更改numpy数组,而且可以由许多对象共享数组的内容。此外,C代码可以获取内部缓冲区的地址,并对底层内存实现自己的修改。缓存结果将有效地禁用numpy的许多有趣用法。
您可以将numpy视为一个低级别的库,它不关心这种性质的优化。如果需要缓存,则应在更高级别实现,如第二个示例所示。
答案 1 :(得分:0)
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"/>
。对于更大的阵列,差异变得更大。