在Python中每N次迭代执行一次语句

我有一个很长的循环,我想检查每N次迭代的状态,在我的具体情况下,我有一个1000万个元素的循环,我想每百万次迭代打印一个简短的报告。 所以,目前我正在做(n是迭代计数器):
if (n % 1000000==0):
    print('Progress report...')
但是我担心我通过计算每次迭代的模数来减慢过程,因为一次迭代只持续几毫秒。 有一个更好的方法吗?或者我不应该担心模数运算?     
已邀请:
当你达到想要的号码时,如何保持计数器并将其重置为零?添加和检查相等性比模数更快。
printcounter = 0

# Whatever a while loop is in Python
while (...):   
    ...
    if (printcounter == 1000000):
        print('Progress report...')
        printcounter = 0
    ...
    printcounter += 1
虽然很可能编译器已经为你做了一些这样的优化......但是这可能让你安心。     
真的放慢了吗?你必须亲自尝试看看。它不会有太大的减速,但如果我们谈论纳秒,它可能是相当大的。或者,您可以将一个1000万个循环转换为两个较小的循环:
m = 1000000
for i in range(10):
    for i in range(m):
        // do sth
    print("Progress report")
    
Sup,dawg?如果您需要其他评论/解释,请与我联系: 1.人类语言宣言 x是已经过的迭代次数。 n是迭代次数(您可以使用整数代替5,块1;或者,您可以使用n替换5作为文字第n次迭代操作,块2) 我们的目标是每x次迭代和每第5次/第n次迭代做一些事情。 我们正在进行100次迭代。 1.易于理解的代码 第1块,最小变量:
for x in 100:
    #what to do every time.
    if x % 5 == 0:
        #what to do every 5th time.
b,概括。
n = 5
for x in 100:
    #what to do every time.
    if x % n == 0:
        #what to do every 5th time.
如果您有任何问题,请告诉我,因为我在此处写完之后没有时间对其进行测试。 3.练习 如果您已正确完成此操作,请查看是否可以将其与tu​​rtle.Pen()和turtle.forward()函数一起使用。 看看你是否可以将这个程序与turtle.circle()函数一起使用。 查看阅读以尝试改进您的计划。 关于模数和其他基本运算符: https://docs.python.org/2/library/stdtypes.html http://www.tutorialspoint.com/python/python_basic_operators.htm 关于龟: https://docs.python.org/2/library/turtle.html https://michael0x2a.com/blog/turtle-examples     
很难知道您的系统如何在不进行测试的情况下优化代码。 您可以通过实现将零评估为false来简化关系部分。
if(not N % 10000000)
   do stuff
    
我会做一些测试,看看模数调用消耗的时间。你可以使用timeit。如果您的结果表明需要减少时间,另一种方法可以消除模数计算:
for m in xrange(m_min, m_max):
    for n in xrange(n_min, n_max):
        #do_n_stuff
    print('Progress report...')
    
那样的东西? :
for n in xrange(1000000,11000000,1000000):
    for i in xrange(n-1000000,n):
        x = 10/2
    print 'Progress at '+str(i)
结果
Progress at 999999
Progress at 1999999
Progress at 2999999
Progress at 3999999
Progress at 4999999
Progress at 5999999
Progress at 6999999
Progress at 7999999
Progress at 8999999
Progress at 9999999
。 编辑 更好:
for n in xrange(0,10000000,1000000):
    for i in xrange(n,n+1000000):
        x = 10/2
    print 'Progress at '+str(i)
灵感来自pajton:
m = 1000000
for n in xrange(0,10*m,m):
    for i in xrange(n,n+m):
        x = 10/2
    print 'Progress at '+str(i+1)
我更喜欢这个,我发现比pajton的解决方案更容易阅读。 它保持显示值取决于i     
它足够快,我不担心它。 如果你真的想加快速度,你可以这样做以避免模数
if (n == 1000000):
    n = 0
    print('Progress report...')
    
这使得内环变瘦,并且
m
不必被
interval
整除。
m = 10000000
interval = 1000000
i = 0
while i < m:
    checkpoint = min(m, i+interval)
    for j in xrange(i, checkpoint):
        #do something
    i = checkpoint
    print "progress"
    

要回复问题请先登录注册