You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中利用缓存加速玩家分数求和,将O(N)优化为O(1)?

优化玩家总分计算的缓存方案

在10000次迭代中,我们每次选择总分最低的玩家参与游戏,该玩家会获得随机分数。当前代码中每次迭代最耗时的部分为计算玩家总分:sum(g.score for g in players[x])。由于每次迭代仅更新一名玩家的分数,可通过缓存将当前O(N)的实现优化为O(1),请问有什么合适的缓存使用方法?

原代码

import random

class Game:
    def __init__(self, score):
        self.score = score

players = {f"player{i}": [] for i in range(8)}

for i in range(10000):
    player = min(players, key=lambda x: sum(g.score for g in players[x]))
    players[player].append(Game(random.randint(0, 10)))

for player, games in players.items():
    print(player, ":", sum(g.score for g in games))

解决方案

方案1:独立字典缓存总分

维护一个单独的字典存储每个玩家的实时总分,每次给玩家添加新分数时同步更新缓存,获取总分直接从字典读取,时间复杂度为O(1)。

修改后的代码:

import random

class Game:
    def __init__(self, score):
        self.score = score

# 初始化玩家游戏列表与总分缓存
players = {f"player{i}": [] for i in range(8)}
player_totals = {player: 0 for player in players}

for i in range(10000):
    # 直接用缓存总分找最低分玩家
    player = min(players, key=lambda x: player_totals[x])
    new_score = random.randint(0, 10)
    players[player].append(Game(new_score))
    # 同步更新缓存
    player_totals[player] += new_score

# 打印时直接使用缓存的总分
for player, total in player_totals.items():
    print(player, ":", total)

方案2:面向对象封装缓存逻辑

将玩家的游戏记录和总分封装到Player类中,让对象自身维护总分状态,代码结构更清晰,缓存逻辑内聚。

修改后的代码:

import random

class Game:
    def __init__(self, score):
        self.score = score

class Player:
    def __init__(self):
        self.games = []
        self.total_score = 0
    
    def add_game(self, game):
        self.games.append(game)
        self.total_score += game.score

# 初始化玩家字典
players = {f"player{i}": Player() for i in range(8)}

for i in range(10000):
    # 直接访问玩家的total_score属性获取总分
    player = min(players, key=lambda x: players[x].total_score)
    new_score = random.randint(0, 10)
    players[player].add_game(Game(new_score))

# 打印玩家总分
for player_name, player in players.items():
    print(player_name, ":", player.total_score)

优化说明

原代码每次执行min操作时,都要遍历玩家的所有Game对象求和,时间复杂度为O(M)(M为该玩家的游戏次数)。10000次迭代下来,总时间复杂度为O(10000NM)(N为玩家数量)。

使用缓存后,获取总分只需直接读取缓存值(O(1)),更新总分仅需一次加法操作(O(1)),单次迭代的时间复杂度降至O(N)(因玩家数量固定为8,实际可视为O(1)),整体运行效率会大幅提升。

内容的提问来源于stack exchange,提问作者gameveloster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 13:18:25