Уведомления

Группа в Telegram: @pythonsu

#1 Март 13, 2012 02:10:56

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Укажите на ошибки!

s0rg
do_strip = lambda a: a.strip()

def parse(infile):
with open(infile) as f:
for line in filter(bool, map(do_strip, f)):
p1, p2 = map(do_strip, line.split('-'))
if p1.endswith((' n', ' v')):
p1 = p1[:-2]
p1 = p1.split(' ', 1)[1]
yield p1, p2
Код явно для второго питона, поэтому вместо объявления do_strip лучше импортировать strip из модуля string - быстрее будет работать.



Офлайн

#2 Март 13, 2012 10:17:20

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Укажите на ошибки!

string - он какбы deprecated, и почему один вызов будет работать быстрее другого?

Офлайн

#3 Март 15, 2012 00:43:35

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Укажите на ошибки!

s0rg
почему один вызов будет работать быстрее другого
потому что у Вас по сути два вызова - вызов функции, вызывающей функцию :)



Офлайн

#4 Март 16, 2012 07:14:25

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Укажите на ошибки!

pyuser
потому что у Вас по сути два вызова - вызов функции, вызывающей функцию :)
/usr/lib/python2.7/string.py:
# Strip leading and trailing tabs and spaces
def strip(s, chars=None):
"""strip(s [,chars]) -> string

Return a copy of the string s with leading and trailing
whitespace removed.
If chars is given and not None, remove characters in chars instead.
If chars is unicode, S will be converted to unicode before stripping.

"""
return s.strip(chars)
)))

Офлайн

#5 Март 17, 2012 01:20:59

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Укажите на ошибки!

s0rg Убедили :). У меня уже месяцев 5 второго питона нет, заглянуть некуда :(.
Тогда str.strip вместо lambda.



Офлайн

#6 Март 20, 2012 21:13:21

Malinaizer
От:
Зарегистрирован: 2009-03-28
Сообщения: 133
Репутация: +  0  -
Профиль   Отправить e-mail  

Укажите на ошибки!

pyuser
s0rg Убедили :). У меня уже месяцев 5 второго питона нет, заглянуть некуда :(.
Тогда str.strip вместо lambda.
Пытаюсь понять ваш спор, что даказывает кусок кода выше, что
string.strip(str) == str.strip() ?
str.strip вместо lambda, почему, избыточность?



Отредактировано (Март 20, 2012 21:21:41)

Офлайн

#7 Март 21, 2012 01:49:50

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Укажите на ошибки!

Ни кто не спорит. Это все имеет отношение к общим рекомендациям по увеличению производительности. Практически во всех букварях рекомендуют для функций map, filter и т.д. использовать встроенные функции, если такой возможности нет, то рекомендуется пользоваться либо списковыми включениями либо конструкцией for … in … (хотя, на вкус и цвет товарищей нет :)). Смотрите сами:

In [1]: from timeit import timeit

In [2]: print(timeit("list(map(lambda s: s.strip(), ('1', '2', '3', '4')))"))
2.331852861187665

In [3]: print(timeit("list(map(str.strip, ('1', '2', '3', '4')))"))
1.7636052207752648
Malinaizer
Пытаюсь понять ваш спор, что даказывает кусок кода выше, что
string.strip(str) == str.strip() ?
Не рекомендуется использовать ключевое слово str в качестве имени переменной :)
А результат Вашего сравнения будет True



Офлайн

#8 Март 21, 2012 08:43:36

Malinaizer
От:
Зарегистрирован: 2009-03-28
Сообщения: 133
Репутация: +  0  -
Профиль   Отправить e-mail  

Укажите на ошибки!

pyuser
Не рекомендуется использовать ключевое слово str в качестве имени переменной :)

Я в курсе, это так для наглядности!

Спасибо вам большое, с вами росту быстрей!



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version