2012-02-28 2 views
1

Я пишу программу, где мне нужно проверить, имеют ли элементы списка определенные типы. Список (г, находится ниже), может получить большой, и я могу проверить стандартный способ:«Сравнение типов» в 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

Вы можете добавить некоторые подсказки, чего вы пытаетесь достичь? Необычно (на питоне), что вам нужно такое дифференцирование по типу. –

+1

Это более полная функция sqrt, чем стандарт Python. – ThisIsNotAnId

+1

Что-то вроде 'cmath.sqrt'? Или 'numpy.sqrt'? –

ответ

12

Согласно Zen of Python

  • Явное лучше, чем неявное.
  • Простое лучше сложного

Так что, если вы хотите сравнить типы, вы должны получить типы и сравнить их. Метод Clearer использует 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

+1

+1 для показа чистого способа сделать это. Я бы дал вам +2, если бы мог; Я никогда раньше не видел синтаксис 'isinstance' кортежа! –

+2

Хотя на самом деле, я думаю, что «явное лучше, чем неявное» является более подходящим правилом здесь :) –

2

Я не уверен, что вы пытаетесь сделать, но так как у вас есть две реализации (почти) готовы, вы должны сравнить их с данных, чтобы решить, реализация которых происходит быстрее в вашего случае.

Я был бы удивлен, увидев большую разницу в производительности, только если # оценить пакет - очень дешевая операция.

С читаемости или ремонтопригодностью точки зрения я бы предпочел первое. Трюк lTemp = l*0 не очень интуитивен для меня.

+1

Я выбираю 'lTemp = l * 0', так как если' l' является сложным или float, 'l * 0 == 0' будет оцениваться как' True' и, соответственно, может быть быстрее. То же самое происходит, если 'l' - это список. – ThisIsNotAnId

Смежные вопросы