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

33 投票
9 回答
108234 浏览
提问于 2025-04-16 15:31

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

所以,目前我做的是这样的(n是循环计数器):

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

但我担心每次循环都计算余数会让这个过程变慢,因为每次循环只需要几毫秒。

有没有更好的方法呢?或者我根本不需要担心这个余数运算?

9 个回答

13

真的变慢了吗?你得自己试试看。其实不会慢很多,但如果我们讨论的是纳秒(非常非常短的时间),那可能就会有点影响。另外,你可以把一个1000万次的循环拆分成两个小循环:

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

1. 用人类语言来解释 xn

x 表示在任何时刻已经检查过的迭代次数。
n 表示你的代码将执行的迭代次数的倍数。

例子 1: “经过 x 次迭代后,n 被执行了多少次?”

例子 2: “现在是第 x 次迭代,而这个动作到目前为止每 n 次就发生一次。”

2. 我们在做什么:

第一个代码块(块 A) 只使用了一个变量 x(上面定义过),并且用数字 5(一个整数)代替了变量 n(上面定义过)。

第二个代码块(块 B) 使用了上面定义的两个变量(xn)。整数 5 将被变量 n 替代。所以,块 B 实际上是在每第 n 次迭代时执行一个动作

我们的目标是在每次迭代时做一件事,而在每第 n 次迭代时做两件事。
我们将进行 100 次迭代。

m. 易于理解的尝试:

块 A,最少变量:

for x in 100:
    #what to do every time (100 times in-total): replace this line with your every-iteration functions.
    if x % 5 == 0:
        #what to do every 5th time: replace this line with your nth-iteration functions.

块 B,概括化。

n = 5
for x in 100:
    #what to do every time (100 times in-total): replace this line with your every-iteration functions.
    if x % n == 0:
        #what to do every 5th time: replace this line with your nth-iteration functions.

如果你有任何问题,请告诉我,因为我在这里写完后没有时间测试它。

3. 练习

  1. 如果你做得对,看看能否用 turtle.Pen()turtle.forward() 函数来使用它。例如,让海龟向前移动 4 次,然后右转并向前移动一次?
  2. 看看能否用 turtle.circle() 函数来使用这个程序。例如,画一个半径加 1 的圆 4 次,然后画一个新颜色的半径加 1 的圆一次?
  3. 查看下面的阅读材料,尝试改进练习 1 和 2 的程序。我想不出做这个的好理由:我只是觉得这可能有用!

关于取模和其他基本运算符:
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

45

你可以考虑用一个计数器,等到计数器达到你想要的数字时,就把它重置为零。这样加法和比较是否相等的速度比取余运算要快。

printcounter = 0

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

虽然编译器可能已经为你做了一些这样的优化……但这样做可能会让你更安心。

撰写回答