Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中每N次迭代执行一次语句_Python_Loops - Fatal编程技术网

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

Python中每N次迭代执行一次语句,python,loops,Python,Loops,我有一个很长的循环,我想每N次迭代检查一次状态,在我的具体例子中,我有一个1000万元素的循环,我想每百万次迭代打印一个简短的报告 所以,目前我正在做(n是迭代计数器): 但我担心我在每次迭代时都会计算模,这会减慢过程,因为一次迭代只持续几毫秒 有更好的方法吗?或者我不应该担心模运算吗?它足够快,我不会担心它 如果你真的想加速,你可以这样做,以避免模数 if (n == 1000000): n = 0 print('Progress report...') 它真的在减速吗?你得

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

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

但我担心我在每次迭代时都会计算模,这会减慢过程,因为一次迭代只持续几毫秒


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

它足够快,我不会担心它

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

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

它真的在减速吗?你得亲自去看看。这不会是一个很大的减速,但如果我们谈论的是纳秒,它可能是相当可观的。或者,您可以将一个1000万循环转换为两个较小的循环:

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

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

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

当你到达想要的号码时,保留一个计数器并将其重置为零,怎么样?添加和检查相等比模运算快

printcounter = 0

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

虽然编译器很可能已经在为您进行类似的优化。。。但这可能会让你心平气和。

类似的事情

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

保持值的显示。如果不进行测试,很难知道系统将如何优化代码

您可以通过认识到零被计算为false来简化关系部分

if(not N % 10000000)
   do stuff

这使得内部循环变瘦,并且
m
不必被
间隔
整除

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"
m=10000000
间隔=1000000
i=0
而我
Sup,老兄?如果您需要其他意见/解释,请与我联系:

1.
x
n
的人类语言声明: 设x为给定时间已检查的迭代次数。 让n是代码将在其上执行的迭代的倍数

2.我们正在做的是: 第一个代码块(块A)仅使用一个变量x(定义见上文),并使用5(整数)而不是变量n(定义见上文)

第二个代码块(块B)使用上面定义的两个变量(x和n)。整数5将被变量n替换。因此,块B在每第n次迭代中执行一个动作

我们的目标是每第X次迭代和每第5次/第N次迭代做一些事情。 我们正在经历100次迭代

M易于理解的代码: 块A,最小变量: B区,概括。 请告诉我,如果你有任何问题,因为我没有时间测试后,写在这里

3.练习
  • 如果您已经正确地完成了此操作,请查看是否可以将其与turtle.Pen()和turtle.forward()函数一起使用
  • 看看是否可以将此程序与turtle.circle()函数一起使用
  • 查看阅读材料(见下文),尝试改进练习1和练习2中的程序
  • 关于模和其他基本运算符:

    关于海龟:

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

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

    谢谢,这看起来是最好的解决方案,但我知道我应该对代码进行分析,以获得明确的答案。谢谢,好的解决方案,如果总长度是报告长度的倍数,这会更好,AndrewKS的答案更一般。这是。答案是“在没有首先确定确实需要之前,永远不要优化”。
    for x in 100:
        #what to do every time (100 times): 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.
    
    n = 5
    for x in 100:
        #what to do every time (100 times): 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.
    
        if n/1000000 == int(n/1000000):
            print(report)