NumpyMatrix函数是否缓冲?

2024-09-27 17:46:59 发布

您现在位置:Python中文网/ 问答频道 /正文

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]])

当然,甚至更大


Tags: 数据lambda函数numpydatanp矩阵array
2条回答

正如Slater Tyranus所指出的,只有基准KR才会显示任何结果:

import numpy as np
import timeit

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

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

setup = '''import numpy as np
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]])
from __main__ import func_a, func_b'''

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

0.02922797203063965

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

0.018524169921875

我也用更大的数据进行了测试。总的来说,我们可以说,它在计算data_max=data.max()之前是有回报的。数组越大,差异就越大。你知道吗

更新问题之后,您似乎在问numpy是否实现了某种形式的缓存。虽然对这个问题没有一般性的回答,但是对于ndarray.max这样的方法,显然没有进行缓存。你知道吗

如果不看执行情况,我们怎么知道呢?考虑到缓存方案必须解决两个问题:

  • 查找存储缓存结果的位置
  • 有一个策略,一旦缓存不再应用,它就会失效。你知道吗

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

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

相关问题 更多 >

    热门问题