python - 避免 Python 函数内重复的大数组计算

标签 python arrays numpy memory optimization

我在最小化过程中重复调用一个需要大数组的函数。这是一个虚拟示例

def foo(N,a):
    big_array = np.mgrid[0:N,0:N]
    b = np.fft.fft2(big_array[0]**a) #some heavy computation
    return b

在最小化过程中,数组大小N不会改变,所以我想使用相同的数组来避免无用的计算和内存分配。

此外,我希望函数 foo 能够自洽,这意味着我不希望另一个函数创建数组并将其提供给 foo最小化过程。

考虑到这些要求,我正在考虑使用一个可调用对象,并将数组作为属性。你怎么看待这件事?有没有更Pythonic的方法可以做?

最佳答案

一个自包含的方法(没有全局变量)是使用一个可变的默认参数(你不应该用它来调用你的函数)来内存先前分配的数组给定的大小

如果数组大小不在字典中,请创建它并添加它。

def foo(N,a,dict_container={}):
    if N in dict_container:
        big_array = dict_container[N]
    else:
        big_array = np.mgrid[0:N,0:N]
        dict_container[N] = big_array

    b = np.fft.fft2(big_array[0]**a) #some heavy computation
    return b

这种方法的主要问题是它禁用了该数组的垃圾收集器,因此如果 N 更改太多,则可能会耗尽内存。相同的技术,但使用 LRU cache可以解决这个问题:

from functools import lru_cache
@lru_cache(maxsize=32)  # max 32 elements in cache
def get_matrix(N):
    return np.mgrid[0:N,0:N]

def foo(N,a):
    big_array = get_matrix(N)
    b = np.fft.fft2(big_array[0]**a) #some heavy computation
    return b

(不要在 foo 中定义 get_matrix ,否则缓存将在每次调用时重新初始化)

关于python - 避免 Python 函数内重复的大数组计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53535668/

相关文章:

python - 将 tensorflow tf.data.Dataset FlatMapDataset 转换为 TensorSliceDataset

java - 使用 for 循环将英语翻译为莫尔斯电码

php - 在 foreach 中的第 3 个元素之后随机排列数组? PHP

python - 如何访问该模型类中的数据?

python - 使这个 C 数组处理代码更像 python(甚至是 numpy)

python - 如何以匀称的方式(或更好的库)创建带弧的多边形

python - Pandas HDFStore 表不接受多索引列

java - JSON:将对象转换为数组

python - 查找共享共同元素的行

python - 如何将变量作为值插入字典中