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

时间:2011-04-11 22:01:15

标签: python loops

我有一个很长的循环,我想检查每N次迭代的状态,在我的具体情况下,我有一个1000万个元素的循环,我想每百万次迭代打印一个简短的报告。

所以,目前我正在做(n是迭代计数器):

if (n % 1000000==0):
    print('Progress report...')

但我担心通过计算每次迭代的模数来减慢过程,因为一次迭代只持续几毫秒。

有更好的方法吗?或者我不应该担心模数运算?

9 个答案:

答案 0 :(得分:23)

当你达到想要的号码时,如何保持计数器并将其重置为零?添加和检查相等性比模数更快。

printcounter = 0

# Whatever a while loop is in Python
while (...):   
    ...
    if (printcounter == 1000000):
        print('Progress report...')
        printcounter = 0
    ...
    printcounter += 1

尽管编译器很可能已经为你做了某种类似的优化......但这可能让你高枕无忧。

答案 1 :(得分:11)

真的放慢了吗?你必须亲自尝试看看。它不会有太大的减速,但如果我们谈论纳秒,它可能是相当大的。或者,您可以将一个1000万个循环转换为两个较小的循环:

m = 1000000
for i in range(10):
    for i in range(m):
        // do sth
    print("Progress report")

答案 2 :(得分:9)

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。练习

  1. 如果您已正确完成此操作,请查看是否可以将其与tu​​rtle.Pen()和turtle.forward()函数一起使用。
  2. 看看你是否可以将这个程序与turtle.circle()函数一起使用。
  3. 查看阅读以尝试改进您的计划。
  4. 关于模数和其他基本运算符: 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

答案 3 :(得分:8)

很难知道您的系统如何在不进行测试的情况下优化代码。

您可以通过意识到零被评估为false来简化关系部分。

if(not N % 10000000)
   do stuff

答案 4 :(得分:2)

我会做一些测试,看看你的模数调用消耗了多少时间。您可以使用timeit。如果您的结果表明需要减少时间,另一种方法可以消除模数计算:

for m in xrange(m_min, m_max):
    for n in xrange(n_min, n_max):
        #do_n_stuff
    print('Progress report...')

答案 5 :(得分:2)

那样的东西? :

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

保持值的显示

答案 6 :(得分:1)

它足够快,我不会担心它。

如果你真的想加快速度,你可以这样做以避免模数

if (n == 1000000):
    n = 0
    print('Progress report...')

答案 7 :(得分:0)

这会使内环变瘦,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"

答案 8 :(得分:0)

当我基于计数迭代进行计时/报告时,我只是将计数器除以所需的迭代,然后确定结果是否为整数。所以:

    if n/1000000 == int(n/1000000):
        print(report)