我想检查某个对象类型是否在列表中,并且为了优化目的,我想不进行循环。
例如:
if list in Mylist:
do something
您正在查找值的类型,因此编写一个生成器来执行
if list in (type(v) for v in Mylist):
do something
这可能不会更快。事实上,我的测试显示我的机器速度较慢。以下是的一些性能测试
from timeit import timeit
Mylist = list(range(30)) + [[1, 2, 3]]
def use_generator():
return list in (type(v) for v in Mylist)
def use_for():
for v in Mylist:
if type(v) is list:
return True
return False
def use_generator_isinstance():
return any(isinstance(v, list) for v in Mylist)
def use_for_isinstance():
for v in Mylist:
if isinstance(v, list):
return True
return False
print("generator", timeit("use_generator()", globals=globals()))
print("for", timeit("use_for()", globals=globals()))
print("generator isinstance", timeit("use_generator_isinstance()", globals=globals()))
print("for isinstance", timeit("use_for_isinstance()", globals=globals()))
输出
generator 2.4875363089959137
for 1.4369069100066554
generator isinstance 2.4251753209973685
for isinstance 1.5919023430033121
在生成器的情况下,将创建一个生成器对象,并重复调用其__next__
。我认为这解释了它的低性能。