繁体   English   中英

优化速度条件

[英]optimizing conditions for speed

示例代码:

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] == range之前找到,我会尝试优化速度以避免每次迭代的e [1]查找。 e [0] ==范围或e [2] ==范围也一样

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

crontab的格式为* * * * *

其中第一个字段是分钟范围(0,60),第二小时范围(0,23),每月第3天范围(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

由于某些字段有时是*不需要列表查找,因此我试图找出基于'*'动态生成条件的方法

看来您想查找所有三个列表共有的所有元素。 这本质上与找到列表表示的集合的交集相同。 在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
if n==4:

会做的。 至少在您的示例中。

也许您应该告诉我们您实际上想做什么? 范围是否总是连续的? 您所受的约束到底是什么?

我认为这应该工作:

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]中存在的值。 如果每个子列表中元素的数量不同,则可以添加进一步的通用优化,该优化以列表大小的顺序对其进行检查,因此您首先要对照最小的列表进行检查(在这种情况下,我是手工完成的,但是知道)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM