优化速度条件

时间:2011-04-10 11:34:52

标签: python optimization

示例代码:

e = [[1,2,3,4],[0,...,10000],[4,5,6,7]]
for n in range(0,1000000):
  if n in e[0] and n in e[1] and n in e[2]:
    yield n

如果我能在e [1] ==范围之前找到,我正在尝试优化速度以避免每次迭代的e [1]查找。 e [0] == range或e [2] == range

也是如此

让我更多地澄清一下..我试图在python中编写crontab http://unixhelp.ed.ac.uk/CGI/man-cgi?crontab+5解析器。

crontab的格式为* * * * *

其中第一个字段是分钟范围(0,60),第二个小时范围(0,23),第三个月范围(1,32),第4个月范围(1,13),第5个星期范围( 0,8)

当每个字段匹配时会发生某些事情, 即每天上午5点30分的格式是

30 5 * * *

现在最简单的解决方案是以60秒的增量迭代下限上限,因为最小增量为1分钟。并使用列表中包含单个数字的全范围匹配字段替换*。

最简单的算法是

for ts in range(startts,endts,60): 
  now = time.localtime(ts)
  if now.tm_min in [5,] and now.tm_hour in [30,] and now.tm_mon in range(0,13) ... etc:
    yield now

因为其中一些字段有时*不需要列表查找,并且我试图找出基于'*'动态生成条件的方法

3 个答案:

答案 0 :(得分:4)

您希望找到所有三个列表共有的所有元素。这与查找列表所代表的集合的交集基本相同。在Python中,我们可以简单地使用set并找到交集。

#! /usr/bin/env python

def get_values(lst):
    sets=map(set,lst)
    common=reduce(lambda x,y:x.intersection(y),sets,set(lst[0]))
    for value in common:
        yield value
if __name__=='__main__':
    e = [[1,2,3,4],range(10000),[4,5,6,7]]  
    for common_item in get_values(e):
        print common_item

答案 1 :(得分:0)

if n==4:

会做到的。至少在你的例子中。

也许您应该告诉我们您的确想要做什么?范围是否始终连续?您正在使用的约束究竟是什么?

答案 2 :(得分:0)

我认为这应该有效:

e = [[1,2,3,4],[0,...,10000],[4,5,6,7]]
for n in e[0]:
  if and n in e[2] and n in e[1]:
    yield n

它只会检查e [0]中存在的值。如果每个子列表中的元素数量不同,您可以添加一个进一步的通用优化,按照列表大小的顺序检查它们,这样您首先检查最小的列表(在这种情况下我手动完成,但是你得到这个想法。