首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python中的缓存加速求和

使用Python中的缓存加速求和
EN

Stack Overflow用户
提问于 2022-07-29 05:42:01
回答 2查看 47关注 0票数 1

在每次10000迭代中,我们选择总分最少的player来玩游戏,在那里他将获得一个随机的分数。

我认为每个迭代中最慢的部分似乎是所有玩家得分的总和。

代码语言:javascript
复制
sum(g.score for g in players[x])

由于每次迭代中只更新一个玩家的得分,缓存似乎有助于将当前的O(N)实现加速到O(1)中。

使用缓存的好方法是什么?谢谢!

代码语言:javascript
复制
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))
EN

回答 2

Stack Overflow用户

发布于 2022-07-29 05:53:08

一个解决方案

一种方法是使用字典来记录总分:

代码语言:javascript
复制
players = {f"player{i}": [] for i in range(8)}
total_player_score = dict.fromkeys(players, 0)

for i in range(10000):
    player = min(total_player_score, key=total_player_score.get)
    game = Game(random.randint(0, 10))
    players[player].append(game)
    total_player_score[player] += game.score

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

输出(一次运行)

代码语言:javascript
复制
player0 : 6252
player1 : 6250
player2 : 6247
player3 : 6247
player4 : 6244
player5 : 6248
player6 : 6250
player7 : 6245

一个更快的解决方案(O(mlogn))

最重要的是,我建议您使用堆来跟踪最小值:

代码语言:javascript
复制
import heapq

players = {f"player{i}": [] for i in range(8)}
total_player_score = [(0, player) for player in players]
heapq.heapify(total_player_score)

for i in range(10000):
    score, player = heapq.heappop(total_player_score)
    game = Game(random.randint(0, 10))
    players[player].append(game)
    heapq.heappush(total_player_score, (score + game.score, player))

第二种方法将代码从O(m*n)转换为O(m*logn),其中n是参与者的数量,m是迭代的次数(代码中的range(1000))。

票数 0
EN

Stack Overflow用户

发布于 2022-07-29 06:00:01

如果您将数据和行为封装在一个Player类中,您可以让该类跟踪总计的文件记录,这样类的调用者就不需要知道它了。这使您可以使用易于准备和高效的代码,而代价是更长的代码:

代码语言:javascript
复制
import random

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

class Player:
    def __init__(self, name):
        self.name = name
        self.scores = []
        self.total = 0
        
    def add_game(self, game):
        self.scores.append(game)
        self.total += game.score


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


for i in range(10000):
    player = min(players, key=lambda player: player.total)
    player.add_game(Game(random.randint(0, 10)))

for player in players:
    print(player.name, ":", player.total)

此打印没有明显的延迟:

代码语言:javascript
复制
player0 : 6280
player1 : 6281
player2 : 6283
player3 : 6280
player4 : 6279
player5 : 6283
player6 : 6277
player7 : 6283
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73162084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档