2012-02-28 117 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