我正在编写一个程序,我必须测试列表中的元素是否属于某种类型。列表(z,见下文)可以变大,我可以测试标准方式:
for l in z:
typeL = type(l)
if typeL == complex or typeL == float:
#evaluate suite
elif typeL == list:
#evaluate different suite
或者,我可以执行以下操作:
for l in z:
lTemp = l*0
if lTemp == 0:
#evaluate suite
elif lTemp == []:
#evaluate different suite
我的问题是,哪种方法更快,更有效或更首选?感谢所有提前。
答案 0 :(得分:12)
因此,如果您想比较类型,您应该获取类型并进行比较。
更清晰的方法是使用接受类型元组参数的isinstance method
。所以你的代码可能如下所示:
for l in z:
if isinstance(l,(complex,float)):
#evaluate suite
elif isinstance(l,list):
#evaluate different suite
此外,isinstance与ABC元课程兼容,因此您可以在选择中更直接,更清晰:
from numbers import Number
from collections import Iterable
for l in z:
if isinstance(l,Number):
#evaluate suite
elif isinstance(l,Iterable):
#evaluate different suite
UPD:您应该记住,premature optimization is the root of all evil回答关于性能的评论中的问题。当你的程序工作时,你可以分析它并找到性能实际下降的位置。接下来你可以在python中优化它,在cython或C中重写,可以使用另一个实现,等等。但是当你在python中编码时,你必须尊重python代码更好的东西。
答案 1 :(得分:2)
我不确定,您尝试做什么,但由于您已准备好两个实现(几乎),您应该使用您的数据对它们进行基准测试,以确定哪些实现在你的案例。
只有当 #evaluate suite 是非常便宜的操作时,我才会惊讶地看到性能上的巨大差异。
从可读性或可维护性的角度来看,我更喜欢第一个。做lTemp = l*0
的诀窍对我来说不是很直观。