Python 更快的'If'使用



我有一个列表:

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

有多个if用法检查一个数字是否在a列表中。

while True:
if 3 in a:
some_work1  #(different)

if 4 in a:
some_work2  #(different)

if 8 in a:
some_work3  #(different)

if 11 in a:
some_work4  #(different)
if 12 in a:
some_work5  #(different)

对于这些多个if使用是否有更快(更少cpu使用)的方法?(列表a总是相同的。它也不会随着迭代而改变。)清单中没有公开的项目。作品不重叠

Python 3.8.7

使用具有恒定插入和检索时间的集合。相比之下,in操作符在a的每次检查中执行线性搜索。

如果没有看到更大的代码,我不确定你的用例是什么。我假设您的用例将a视为标志列表。因此,set符合要求。

a = [1, 2, 3, 4, 5, 6, 7, 8, 9 10, 11, 12]
a = set(a)  # pass an iterable
# or simply
a = {1, 2, 3, 4, 5, 6, 7, 8, 9 10, 11, 12}
# or built at runtime
a = set()
a.add(1)
a.add(2)
if 3 in a:
some_work1 

如果你想要一个更有效的switch语句,你已经找到了。Python为此使用if..elif。这确保了每个都按短路顺序进行评估。如果您可以匹配多个结果,请使用字典(例如{3: functor3, 4: functor4, ...})。函函数是可调用的,即它定义了一个__call__()方法。lambda也满足这个条件。

set是不允许重复的无序集合。它就像一个字典,但是去掉了值,只留下键。如您所知,字典键是唯一的,同样,集合的成员也是唯一的。这里我们只需要一个用于表演的集合。

option 1

您可以使用字典,其键为a中的数字,值为相应的函数。然后循环它们一次,并将所需的函数存储在数组(to_call)中。在while循环中,只需遍历该数组并调用其成员。

def some_work1():
print("work1")
def some_work2():
print("work2");
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
func = {3:some_work1,4:some_work2}
to_call = []
for k in func:
if k in a:
to_call.append(func[k])

while 1:
for f in to_call:
f();

选项2

编写某种代码生成器,读取a并生成包含函数调用的.py文件。

最新更新