单个VS. Python中的多个循环?

时间:2011-05-29 05:05:16

标签: python

比较python中的以下代码示例时(300只是一个示例;实际上,假设我们需要循环的10,000,000个项目):

sum = 0
for i in xrange(0, 300):
    sum += i

Vs以上。

sum = 0
for i in xrange(0, 100):
    sum += i
for i in xrange(100, 200):
    sum += i
for i in xrange(200, 300):
    sum += i

两个版本的运行时间是否相同?我有一个问题,我有一个巨大的矢量(比方说,10,000项)。除非满足某些条件,否则我不一定要遍历所有条件(这些条件只能在第一个循环 - 使用前100个项目完成时才能评估)。

然后,我应该只在满足某些条件时继续循环(这些条件只能在检查接下来的100个项目时进行评估)。

然后,我应该只在满足某些条件时继续循环(这些条件只能在检查接下来的100个项目时进行评估)。

同样的故事,直到我到达矢量的末尾................

鉴于我可以通过模块化的方式解决我的问题:

{0,100} {100,200} {200,300} ........ {9900,10,000}

我所要做的就是了解第二种方法是否与第一种方法一样有效。感谢。

注意:此处使用sum是为了简单起见。实际上,将要使用的数学运算的运行时间要长得多。这就是为什么我试图通过检查不同的编码方法来寻找优化运行时间的方法......

3 个答案:

答案 0 :(得分:4)

你希望看到什么样的改进?

timeit将帮助您发现差异:

$ python -m timeit 'sum = 0
> for i in xrange(0, 300):
>     sum += i'
10000 loops, best of 3: 21.8 usec per loop

$ python -m timeit 'sum = 0
> for i in xrange(0, 100):
>     sum += i
> for i in xrange(100, 200):
>     sum += i
> for i in xrange(200, 300):
>     sum += i'
10000 loops, best of 3: 22.8 usec per loop

就个人而言,我会选择:

$ python -m timeit 'sum(xrange(300))'
100000 loops, best of 3: 5.34 usec per loop

此示例可能不是评估您是否能够优化实际代码的最佳方式,但它确实展示了如何测试一小段代码的运行时间。

记住what Donald Knuth said about optimisation; - )

这是一种可以检查迭代并在需要时突破的方法:

>>> for index, item in enumerate(vect):
...     results = do_stuff_with(item)
...     if index % 100 == 0 and should_we_stop(results):
...         break

更好的是,如果您do_stuff_with()可以返回tuple表示它是否已完成,那么您可以检查每次迭代是否已完成,而不是等待:

>>> for item in vect:
...     finished, results = do_stuff_with(item)
...     if finished:
...         break

只是重申(没有双关语)很难说如何(甚至是否)优化你的实际代码而不实际看到它!

答案 1 :(得分:1)

如果您不打算遍历所有这些,那么设置新生成器(xrange)的成本非常低。

因此,如果您有时跳过其中一个或两个循环,第二种方法会更快。

也就是说,如果您的列表只有300个大,那么差异可以忽略不计,大小为毫秒或微秒。

答案 2 :(得分:1)

如果您想比较速度,只需将它们计时:

import timeit

chunk1 = '''
sum = 0
for i in xrange(0, 300):
    sum += i
'''

chunk2 = '''
sum = 0
for i in xrange(0, 100):
    sum += i
for i in xrange(100, 200):
    sum += i
for i in xrange(200, 300):
    sum += i
'''

timer1 = timeit.Timer(chunk1)
timer2 = timeit.Timer(chunk2)

print timer1.timeit(100000)
print timer2.timeit(100000)

我得到100,000次迭代的这些数字:

3.44955992699
3.56597089767

如您所见,第二块代码稍慢。


您可以尝试while循环和break语句,所以这就是我将您解释为尝试的内容:

i = 0

while i < limit:
  stop = False

  for j in xrange(i + 100, i + 300):
    if i == foo:
      stop = True
      break

  if stop:  break
  i += 1