当我学习 Python(特别是 Jython,如果这里的区别很重要)时,我正在编写一个简单的终端游戏,它使用技能和基于技能水平的掷骰子来确定尝试动作的成功/失败。我希望最终在更大的游戏项目中使用此代码。
在压力测试下,代码使用了 0.5GB 的内存,并且似乎需要相当长的时间才能获得结果(约 50 秒)。可能只是任务真的那么密集,但作为一个菜鸟,我敢打赌我只是在做事效率低下。任何人都可以提供一些提示:
如何提高这段代码的效率
以及如何以更 Pythonic 的方式编写此代码?
import random def DiceRoll(maxNum=100,dice=2,minNum=0): return sum(random.randint(minNum,maxNum) for i in xrange(dice)) def RollSuccess(max): x = DiceRoll() if(x <= (max/10)): return 2 elif(x <= max): return 1 elif(x >= 100-(100-max)/10): return -1 return 0 def RollTesting(skill=50,rolls=10000000): cfail = 0 fail = 0 success = 0 csuccess = 0 for i in range(rolls+1): roll = RollSuccess(skill) if(roll == -1): cfail = cfail + 1 elif(roll == 0): fail = fail + 1 elif(roll == 1): success = success + 1 else: csuccess = csuccess + 1 print "CFails: %.4f. Fails: %.4f. Successes: %.4f. CSuccesses: %.4f." % (float(cfail)/float(rolls), float(fail)/float(rolls), float(success)/float(rolls), float(csuccess)/float(rolls)) RollTesting()
编辑 - 这是我现在的代码:
from random import random
def DiceRoll():
return 50 * (random() + random())
def RollSuccess(suclim):
x = DiceRoll()
if(x <= (suclim/10)):
return 2
elif(x <= suclim):
return 1
elif(x >= 90-suclim/10):
return -1
return 0
def RollTesting(skill=50,rolls=10000000):
from time import clock
start = clock()
cfail = fail = success = csuccess = 0.0
for _ in xrange(rolls):
roll = RollSuccess(skill)
if(roll == -1):
cfail += 1
elif(roll == 0):
fail += 1
elif(roll == 1):
success += 1
else:
csuccess += 1
stop = clock()
print "Last time this statement was manually updated, DiceRoll and RollSuccess totaled 12 LOC."
print "It took %.3f seconds to do %d dice rolls and calculate their success." % (stop-start,rolls)
print "At skill level %d, the distribution is as follows" % (skill)
print "CFails: %.4f. Fails: %.4f. Successes: %.4f. CSuccesses: %.4f." % (cfail/rolls, fail/rolls, success/rolls, csuccess/rolls)
RollTesting(50)
和输出:
Last time this statement was manually updated, DiceRoll and RollSuccess totaled 12 LOC.
It took 6.558 seconds to do 10000000 dice rolls and calculate their success.
At skill level 50, the distribution is as follows
CFails: 0.0450. Fails: 0.4548. Successes: 0.4952. CSuccesses: 0.0050.
值得注意的是,这并不等效,因为我将随机计算更改为足以产生明显不同的输出(原来的应该是 0-100,但我忘了除以骰子的数量)。内存使用量现在看起来约为 .2GB。此外,之前的实现无法进行 1 亿次测试,我已经运行了多达 10 亿次测试(花了 8 分钟,内存使用似乎没有显着不同)。