[英]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.