使用GPU(使用CUDA)在python中添加和删除是否更快?

2024-10-03 06:31:02 发布

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

我正在模拟war card games,但我需要非常高的性能。我实际上使用Cython和多处理模块。我的i76700的速度确实很快(约33000次战争/秒)。我认为这是很快的,因为python存储的是列表中对象的引用,而不是直接存储数据(例如在C和其他语言中)。如果我错了,我仍然可以使用numpy数组。在

程序可以高度并行化。(而且是多流程的 版本)。 一个GPU版本的代码能加快程序的速度吗?这个程序基本上只是比较数字和添加/删除列表?我有一台gtx1060 6GB。在

所有的数据处理都是在模拟数据的同时进行的,所以数据不能存储在数据库中,所有操作都在RAM中进行。内存很少,所以我认为6GB就足够了。因此,我们不需要通过pcie总线发送任何数据(除了图表的绘图)。在

下面是有问题的代码:(为了简单起见,不使用多处理)

class Battle:
    def __init__(self):
        self.nb_trick = 0
        self.escarmoucheDepth = 0
        self.player1 = []
        self.player2 = []
        self.distribute()
        self.base_deck = (tuple(self.player1), tuple(self.player2))

    def distribute(self):
        """distribute the deck to the 2 players"""
        deck = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 1, 2, 3, 4,
                5, 6, 7, 8, 9, 10, 11, 12, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
        np.random.shuffle(deck)
        self.player1 = deck[:26]
        self.player2 = deck[26:]

    def escarmouche(self):
        """when both players have the same card"""
        self.escarmoucheDepth = 0
        try:
            while self.player1[self.escarmoucheDepth] == self.player2[self.escarmoucheDepth]:
                self.escarmoucheDepth += 2
            if self.player1[self.escarmoucheDepth] > self.player2[self.escarmoucheDepth]:
                redistribute(self.player1, self.player2, self.escarmoucheDepth)
            elif self.player2[self.escarmoucheDepth] > self.player1[self.escarmoucheDepth]:
                redistribute(self.player2, self.player1, self.escarmoucheDepth)
        except IndexError:
            self.player1 = []
            self.player2 = []

    def trick(self):
        while self.player1 and self.player2:
            self.nb_trick += 1
            if self.player2[0] > self.player1[0]:
                self.player2.append(self.player1[0])
                self.player2.append(self.player2[0])
                del self.player1[0]
                del self.player2[0]
            elif self.player1[0] > self.player2[0]:
                self.player1.append(self.player2[0])
                self.player1.append(self.player1[0])
                del self.player1[0]
                del self.player2[0]
            else:
                self.escarmouche()
        if self.nb_trick > 10000:
            print("Infinite War?")
            return 4, self.nb_trick, tuple(self.base_deck)
        elif len(self.player2) <= 0 < len(self.player1):
            return 1, self.nb_trick, tuple(self.base_deck)
        elif len(self.player1) <= 0 < len(self.player2):
            return 2, self.nb_trick, tuple(self.base_deck)
        elif len(self.player2) <= 0 and len(self.player1) <= 0:
            return 3, self.nb_trick, tuple(self.base_deck)


def redistribute(winner, looser, depth):
    """redistribute the cards after an escarmouche"""
    for i in range(depth+1):
        winner.append(looser[0])
        winner.append(winner[0])
        del winner[0]
        del looser[0]

重述

  • 使用我的GPU在python中添加和删除是否更快?在
  • 如果是,那么我需要直接为GPU编写CUDA代码还是有任何最简单的解决方案?在
  • 如果python不适合做这种事情,你能告诉我什么更好吗。我可以用另一种编程语言构建一个扩展,并使用python作为脚本语言。在
  • 对于这个用例,numpy数组比列表更好吗?我听说当你编译的时候,numpy数组比列表要快。在

如果您需要更多信息,请随时询问!在

提前感谢您的回答。在

Python版本:3.5

GitHub上的项目:https://github.com/ZeeGabByte/War-cards-game-simulation/tree/master (如果你需要的话,这里有一个法语的Wiki)。在

PS:我对Python比较陌生。在


Tags: selfbaselendefdeckdelnbelif