Понимание конкретного цикла (python) [duplicate]

Определить метод класса:

class Foo(object):
    bar = 1
    @classmethod
    def bah(cls):    
        print cls.bar

Теперь, если bah() должен быть методом экземпляра (т. е. иметь доступ к self), вы все равно можете напрямую обращаться к переменной класса.

class Foo(object):
    bar = 1
    def bah(self):    
        print self.bar
22
задан thefourtheye 5 June 2015 в 15:27
поделиться

1 ответ

Понятия списка более компактны и быстрее, чем явный цикл for, создающий список:

def slower():
    result = []
    for elem in some_iterable:
        result.append(elem)
    return result

def faster():
    return [elem for elem in some_iterable]

Это связано с тем, что вызов .append() на list заставляет объект списка расти (в кусках), чтобы сделать пространство для новых элементов индивидуально, в то время как понимание списка собирает все элементы перед созданием list, чтобы соответствовать элементам за один раз:

>>> some_iterable = range(1000)
>>> import timeit
>>> timeit.timeit('f()', 'from __main__ import slower as f', number=10000)
1.4456570148468018
>>> timeit.timeit('f()', 'from __main__ import faster as f', number=10000)
0.49323201179504395

Однако это не значит, что вы должны начинать пользоваться списками для всего! Постижение списка все равно построит объект списка ; если вы используете понимание списка только потому, что оно дает вам однострочный цикл, подумайте еще раз. Вероятно, вы тратите впустую циклы, создавая объект списка, который вы затем отбрасываете. Просто придерживайтесь нормального цикла for в этом случае.

40
ответ дан Martijn Pieters 22 August 2018 в 21:05
поделиться
  • 1
    Они также делают код выше. (Я думаю, вы об этом уже назовете, назвав их «явным»). – Steven Rumbalski 2 May 2013 в 16:27
  • 2
    Стоит отметить (хотя вопрос только требует преимуществ), что чрезмерное использование списков может легко привести к худшему коду, как в эффективности, так и в удобочитаемости / ремонтопригодности. Слишком много раз я видел несколько списков, проходящих через один и тот же цикл, один за другим. Я также видел список comps, используемый для промежуточных результатов, что должно быть сделано с помощью compents генератора. Вы можете построить очень сложное понимание списка, которое по-прежнему эффективно с использованием серии генераторных comp, заканчивающихся в списке comp. Они удобны и быстры в отдельных случаях, но будьте осторожны с контекстом! – DylanYoung 3 April 2018 в 16:59
  • 3
    @DylanYoung: абсолютно, вы никогда не должны использовать понимание списка для побочных эффектов. Если вы используете понимание списка только потому, что оно будет зацикливаться на , вы тратите впустую циклы на создание объекта списка. – Martijn Pieters♦ 3 April 2018 в 17:16
  • 4
    Абсолютно! Однако не только побочные эффекты. Часто вы хотите создать несколько списков (или dicts и т. Д.) Из одного и того же исходного списка (например, для обратного ссылки). Я часто видел, что это было сделано как серия понятий (список и / или диктофон и / или набор), когда один цикл сделал бы для их построения. – DylanYoung 3 April 2018 в 18:14
  • 5
    @DylanYung: один цикл не будет более эффективным. Такая же алгоритмическая сложность применяется, поэтому она будет сведена к постоянным факторам. Перечисление понятий выигрывает по постоянным факторам. – Martijn Pieters♦ 3 April 2018 в 18:25
Другие вопросы по тегам:

Похожие вопросы: