2014-10-28 35 views
0

我想了解什么是最有效的方式来限制我的循环范围。这里的想法是我的j被输入到一个需要事先确定的函数中。使循环范围有条件的最佳方法?

我正在处理的问题的一个约束是j必须总是小于i。

max_value = None 

for i in range(1,1499): 
    for j in range(1,1499): 
     if i > j: 
      candidate = some_function(i,j) 
      if candidate > max_value: 
       max_value = candidate 

现在我的i> j声明在这里没有必要,因为最好的解决方案总是会在i> j的地方。但是,因为我知道这一点,所以我想利用这个来限制我的范围,并停止计算更多的循环。

什么是最好的方式去做这件事?我在想这件事可能会起作用:

max_value = None 

for i in range(1,1499): 
    for j in range(1,i): 
     candidate = some_function(i,j) 
     if candidate > max_value: 
      max_value = candidate 

还有其他想法或建议吗?实际的循环问题比这个要大得多,所以速度是一个考虑因素,任何建议都是值得欢迎的!

+0

“可能工作”?你试过了吗? – BartoszKP 2014-10-28 23:33:43

+0

修复缩进后,它将起作用(在“if”行末尾没有冒号,下一行应该缩进)。另外,如果你使用Python <3,使用'xrange()'也应该加速。 – 2014-10-28 23:35:46

+0

除了上面所有相关的评论外,请尝试。 'timeit'应该这样做。 https://docs.python.org/2/library/timeit.html – 2014-10-28 23:38:48

回答

1

我想以最快的方式写这蟒蛇很可能是:

max(some_function(i,j) for i in xrange(1, 1499) for j in xrange(1, i)) 

现在你不range创建不必要的名单,而且大多数的执行将是C代码,因为它只是一台发电机表达式不显式python循环。

当然,请按照评论者提到的timeit检查结果。

+0

谢谢wim。是否有任何理由为什么会在for循环中使用xrange而不是range?在线搜索,我已经在for循环中收集了它,它是同样的事情,但迭代更有效,因此更快。 – ploo 2014-10-29 00:14:55

+1

我建议在itertools.combinations(xrange(1,1499),2)'中使用'for j,而不要在生成器表达式中使用两个'for'子句。 – Blckknght 2014-10-29 00:25:35

+0

如果您不需要生成的列表(除迭代以外),请使用'xrange'。如果你想要列表,例如使用'range'进行索引。 – wim 2014-10-29 10:51:25

0

很酷的东西可以通过使用irange。即:

for i in range(1,1499): 
    for j in range(1,i): 
     candidate = some_function(i,j) 
     if candidate > max_value: 
      max_value = candidate 

另请注意,我在max_value = candidate处修正了一个缩进。