Python中的“类型比较”

时间:2012-02-28 19:45:18

标签: python algorithm types comparison

我正在编写一个程序,我必须测试列表中的元素是否属于某种类型。列表(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

我的问题是,哪种方法更快,更有效或更首选?感谢所有提前。

2 个答案:

答案 0 :(得分:12)

根据Zen of Python

  • 明确胜于隐性。
  • 简单比复杂
  • 更好

因此,如果您想比较类型,您应该获取类型并进行比较。 更清晰的方法是使用接受类型元组参数的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的诀窍对我来说不是很直观。