我正在模拟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]
如果您需要更多信息,请随时询问!在
提前感谢您的回答。在
Python版本:3.5
GitHub上的项目:https://github.com/ZeeGabByte/War-cards-game-simulation/tree/master (如果你需要的话,这里有一个法语的Wiki)。在
PS:我对Python比较陌生。在
目前没有回答
相关问题 更多 >
编程相关推荐