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

2024-09-25 00:28:52 发布

您现在位置:Python中文网/ 问答频道 /正文

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

所以基本上我输入了成千上万的数字,我必须把它们每一个都发送到“lookfor”得到一个输出,要么是“alist”中“number”的索引,要么是“no”,如果这个数字不存在的话。 当我输入的数字不是那么多,而是输入xx,xxx,xxx,xxx的时候,它能很好地计算。 有什么建议吗?你知道吗


Tags: noinnumberindexreturnifdef数字
3条回答

您的代码当前需要在整个列表中搜索对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

您的代码在列表中迭代,直到找到您要查找的数字(或者直到到达末尾),如果找到了数字,则必须迭代相同的数量才能返回索引。为什么不利用.index方法的行为呢?请记住,如果该数字不在列表中,则会引发ValueError。你知道吗

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

后记:使用^{}模块来找到最有效的解决方案,但是一定要使用各种输入,这样才能找到最快的解决方案。你知道吗

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)

相关问题 更多 >