我有一个很长的循环,我想检查每N次迭代的状态,在我的具体情况下,我有一个1000万个元素的循环,我想每百万次迭代打印一个简短的报告。
所以,目前我正在做(n是迭代计数器):
if (n % 1000000==0):
print('Progress report...')
但我担心通过计算每次迭代的模数来减慢过程,因为一次迭代只持续几毫秒。
有更好的方法吗?或者我不应该担心模数运算?
答案 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?如果您需要其他评论/解释,请与我联系:
x是经过的迭代次数。 n是迭代次数(您可以使用整数代替5,块1;或者,您可以使用n替换5作为文字第n次迭代操作,块2) 我们的目标是每x次迭代和每第5次/第n次迭代做一些事情。 我们正在进行100次迭代。
第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.
如果您有任何问题,请告诉我,因为我在此处写完之后没有时间对其进行测试。
关于模数和其他基本运算符: 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)