在Python中每N次迭代执行语句
我有一个很长的循环,我想每过N次循环就检查一下状态。在我的具体情况中,我有一个包含1000万元素的循环,我想每一百万次循环打印一次简短的报告。
所以,目前我做的是这样的(n是循环计数器):
if (n % 1000000==0):
print('Progress report...')
但我担心每次循环都计算余数会让这个过程变慢,因为每次循环只需要几毫秒。
有没有更好的方法呢?或者我根本不需要担心这个余数运算?
9 个回答
真的变慢了吗?你得自己试试看。其实不会慢很多,但如果我们讨论的是纳秒(非常非常短的时间),那可能就会有点影响。另外,你可以把一个1000万次的循环拆分成两个小循环:
m = 1000000
for i in range(10):
for i in range(m):
// do sth
print("Progress report")
1. 用人类语言来解释 x
和 n
:
让 x
表示在任何时刻已经检查过的迭代次数。
让 n
表示你的代码将执行的迭代次数的倍数。
例子 1: “经过 x
次迭代后,n
被执行了多少次?”
例子 2: “现在是第 x
次迭代,而这个动作到目前为止每 n
次就发生一次。”
2. 我们在做什么:
第一个代码块(块 A) 只使用了一个变量 x
(上面定义过),并且用数字 5(一个整数)代替了变量 n
(上面定义过)。
第二个代码块(块 B) 使用了上面定义的两个变量(x
和 n
)。整数 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. 练习
- 如果你做得对,看看能否用
turtle.Pen()
和turtle.forward()
函数来使用它。例如,让海龟向前移动 4 次,然后右转并向前移动一次? - 看看能否用
turtle.circle()
函数来使用这个程序。例如,画一个半径加 1 的圆 4 次,然后画一个新颜色的半径加 1 的圆一次? - 查看下面的阅读材料,尝试改进练习 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
你可以考虑用一个计数器,等到计数器达到你想要的数字时,就把它重置为零。这样加法和比较是否相等的速度比取余运算要快。
printcounter = 0
# Whatever a while loop is in Python
while (...):
...
if (printcounter == 1000000):
print('Progress report...')
printcounter = 0
...
printcounter += 1
虽然编译器可能已经为你做了一些这样的优化……但这样做可能会让你更安心。