2012-02-28 71 views
1

我正在编写一个程序,我必须测试列表中的元素是否属于某种类型。该列表(Z,发现下面)可以得到很大,我可以测试的标准方式:Python中的“类型比较”

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 

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

+6

你可以添加一些提示,你试图实现什么?这是不寻常的(在Python中)你需要按类型区分这种差异。 – 2012-02-28 19:50:45

+1

这是一个比Python标准更全面的sqrt函数。 – ThisIsNotAnId 2012-02-28 19:54:59

+1

类似'cmath.sqrt'?或'numpy.sqrt'? – 2012-02-28 20:02:46

回答

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代码。

+2

使用'isinstance()'的加值功能:适用于子类。 – kindall 2012-02-28 20:00:57

+1

+1表示干净的方式。如果可以的话,我会给你一个+2的;我从来没有见过'isinstance'元组语法! – 2012-02-28 20:01:35

+2

虽然实际上,我认为“明确比隐含更好”是一个更合适的规则:) – 2012-02-28 20:02:13

2

我不知道,你试图做什么,而是因为你有两个实现(几乎)准备好了,你应该比较基准与的数据,以决定其实现是情况下更快。

只有#评估套件是一个非常便宜的操作,我会惊讶地发现性能有很大差异。

可读性可维护性观点我宁愿第一个。做lTemp = l*0的窍门对我来说不是很直观。

+1

我选择'lTemp = l * 0',因为如果'l'是一个复数或浮点数,'l * 0 == 0'将被评估为'True',因此可能会更快。如果'l'是一个列表,也是一样。 – ThisIsNotAnId 2012-02-28 20:11:28