【问题标题】:Python Memoization with dict - Performance Issue带有 dict 的 Python 记忆 - 性能问题
【发布时间】:2018-04-01 14:21:22
【问题描述】:

我正在使用遗传算法来解决优化问题。 我使用记忆来加速计算,因为适应度评估非常耗时。它的实现方式如下:

def memoize(f):
    memo = {}
    def helper(my_input):
        if my_input not in memo:   
            if len(memo)%100000==0:
                print('increased memo size:', len(memo))

            memo[my_input] = f(my_input)
        return memo[my_input]
    return helper

@memoize
def eval_fitness(individual):
    #time consuming calc
    return fitness

我注意到 memo dict 的大小在第一代迅速增加,然后缓慢增加(例如在第 500 代达到 14M 键)。

另一方面,每一代的经过时间在第一代中很高(即 40 秒),然后随着记忆的回报而减少。 尽管如此,如上图所示,我注意到经过时间数据序列的非单调行为:计算速度变慢,整体计算时间急剧增加。

我使用单一进程。内存使用率安全地低于 20%。

  • 关于这种行为的根本原因有什么想法吗?
  • 如何避免这种减速?

【问题讨论】:

    标签: python python-3.x dictionary data-structures memoization


    【解决方案1】:

    这可能是正确的行为,你无法避免。

    随着您的人口随机变化,有时会出现大量新个体。在这些时刻,记忆并不能带来强大的时间改进(200->400 代)。另一方面,如果人口稳定了几代,记忆效果很好(大约 200 和 ~410)。

    附言

    很好的装饰器,但它已经在 functools 模块中实现为 lru_cache。

    【讨论】:

    • 感谢您的回答。我已经编辑了我的问题,添加了每一代的字典大小图。实际上,这表明没有这种人口稳定/大量新个体的时刻;确实它与经过的时间图不一致。
    猜你喜欢
    • 2013-08-14
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 2019-01-08
    • 2019-06-13
    • 2015-08-07
    • 1970-01-01
    • 2013-01-05
    相关资源
    最近更新 更多