我目前有一个for-loop,它会经过无数次迭代来检查某些东西,当它进入新的迭代时,我需要它来检查一个变量是否我有与当前迭代相同的大小。
这是我正在做的示例代码:
import datetime
now = datetime.datetime.now()
printcounter = 0
for i in range(3,100000000000+1,2):
if (printcounter == 1000000000):
print(i,"at %d" %now.hour, "hours and %d" % now.minute, "minutes.")
printcounter = 0
else:
#Do operation
printcounter += 1
但是,由于在我得到答案之前它可能经历了数百万次繁重的数学运算,我注意到通过剥离“printcounter”变量的这段代码而不给我进度报告让我得到了显着的加速,整整几分钟有时。
有没有办法只检查“printercounter”变量是否等于 10000,而不是让它检查每一次迭代?
无论如何,我个人无法想到不求助于嵌套 for 循环,这可能会变得很脏,我宁愿没有。
顺便说一下,我使用的是 Windows 8.1、Python 3.5.1,如果这有什么不同的话。
编辑:
我知道打印需要花费大量时间,但是,如果我改为打印到文件;我的硬盘非常很快,然后我仍然得到相同的时间差异,尽管减少了时间差异。另外,我一直想在很多其他脚本中实现这个问题的解决方案,所以即使这不是这里的主要问题,我仍然想知道如何去做。
编辑 2:
可能是我没说清楚的错。我想看看是否有可能每隔一段时间检查一次值,而不是每次都检查一次。例如,我不希望我的代码在“printcounter”为 1 时检查它是否等于 1000000000,这很荒谬。我知道机器运行得快得离谱,所以没关系,但我很好奇是否有可能减少它以这种方式检查的次数,而不是有一个允许自己草率或懒惰的愚蠢代码只是因为它的纠正速度足够快。
请您参考如下方法:
如果你不想每次迭代都检查变量,让它变得不必要......
通过做这样的事情来代替:
import datetime
iterations = 100000000000
subiterations = 10000
chunks, remaining = divmod(iterations, subiterations)
now = datetime.datetime.now()
printcounter = 0
for i in range(chunks):
for j in range(subiterations):
#Do operation
pass
printcounter += subiterations
print('{:,d} at {} hours {} minutes'.format(printcounter, now.hour, now.minute))
if remaining:
for j in range(remaining):
#Do operation
pass
printcounter += remaining
print('{:,d} at {} hours {} minutes'.format(printcounter, now.hour, now.minute))
