不要每次迭代检查变量

时间:2016-04-25 16:37:14

标签: python performance python-3.x variables for-loop

我目前有一个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'变量并没有给我一个进度报告给我一个显着的加速,有时整整几分钟。

有没有办法只检查打印机是否有'变量等于10000,但不检查每一次迭代? 无论如何,我个人无法想到不用嵌套换环,这可能会变得非常脏,而我却没有。

顺便说一句,我使用的是Windows 8.1,Python 3.5.1,如果这有任何区别的话。

修改
据我所知,如果我打印到文件中,则需要花费大量时间进行打印;我的硬盘非常快,然后我仍然得到相同的,虽然减少了,时间上的差异。此外,我一直希望在很多其他脚本中实现这个解决方案,所以即使这不是一个主要问题,我仍然想知道如何做到这一点。

编辑2:
也许这是我的错,因为我不清楚。我想看看是否有可能每隔一段时间检查一次值,而不是每次都检查一次。例如,我不希望我的代码检查是否打印过' printcounter'当它是1时,等于10亿,这是荒谬的。我知道机器的运行速度非常快,所以它并不重要,但我很想知道是否有可能减少它检查这种方式的次数,而不是让一个愚蠢的代码让自己变得草率或懒惰只是因为它足够快以纠正它。

4 个答案:

答案 0 :(得分:2)

加速不是因为检查该变量。这是因为print语句本身。所以不,除了删除该声明之外,没有办法进一步加快速度。

并明确回答您的具体问题:您可以重新构建代码,以便不必进行检查,例如,使用嵌套for循环。但这可能会慢一些。检查一个布尔比较非常小的时间。

答案 1 :(得分:2)

如果您不希望每次迭代检查变量,请将其作为不必要的...
通过做这样的事情来代替:

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))

答案 2 :(得分:1)

由于printcounter在每次迭代时都会递增,为什么不使用嵌套for循环?

大致像这样:

import datetime
now = datetime.datetime.now()

for j in range(100):
    print(j, "at %d" %now.hour, "hours and %d"  % now.minute, "minutes.")
    for i in range(1000000000):
          #Do operation

答案 3 :(得分:0)

它并没有太大的区别,因为与实际的print语句相比,int数学很小,但是:

import datetime


now = datetime.datetime.now()
step = 2
init = 3
for i in range(init, 100000000000+1, step):
    if (i % 10000*step) == init:  #since we start at 3 and step by 2
         print(i,"at %d" %now.hour, "hours and %d"  % now.minute, "minutes.")
    # Do Stuff

这种结构将消除一些操作,但它们都不是慢速操作。但就代码结构而言,我就是这样做的。