如何让这段代码执行得更快?

时间:2014-02-04 21:27:21

标签: python list if-statement

def lookfor(alist, number):
  if number in alist:
    return alist.index(number)
  else:
    return "no"

所以基本上我输入了成千上万的数字,我必须发送它们中的每一个“寻找”得到“alist”中“number”索引的输出,或者如果数字是non则得到“no”在那里。 它完美地计算我输入的数字不是很多,但输入xx,xxx-xxx,xxx数字需要几分钟。 有什么建议?

3 个答案:

答案 0 :(得分:1)

您的代码会遍历列表,直到找到您要查找的数字(或直到它到达结尾),如果找到了数字,则必须迭代完全相同的数量才能返回索引。为什么不利用.index方法的行为?请记住,如果列表中没有该号码,则会引发ValueError

def lookfor(alist, number):
    try:
        return alist.index(number)
    except ValueError:
        return "no"

后记:使用timeit模块找到最有效的解决方案,但请务必使用各种输入,以便找到最快的解决方案。

答案 1 :(得分:1)

您的代码目前需要在每次调用lookfor时搜索整个列表。如果alist足够大,这可能会非常慢。

相反,您应该创建一个字典,将每个元素映射到alist中的索引。例如,对于alist = [7,4,88],您需要:indexmap = {7:0, 4:1, 88:2}。然后你可以用:

搜索字典
def lookfor(indexmap, number):
    return indexmap.get(number, "no")

如果alist是常量,您可以在初始化期间创建indexmap

indexmap = {number: index for index,number in enumerate(alist)}

如果alist随时间变化,您可以将此词典与alist一起维护。例如,如果您通常使用append添加项目,则可以使用:

alist.append(number)
if number not in indexmap:
    indexmap[number] = len(alist) - 1

答案 2 :(得分:1)

def index_on(lst):
    index = {val:i for i,val in enumerate(lst)}
    def lookup(val):
        return index.get(val, 'no')
    return lookup

search = index_on(alist)

search('123-4567')   # => 293   (index in alist)
search('123-4500')   # => 'no'  (not found)