[Python2.4-2.5. Оптимизация] Забавные факты

tipnote


#import psyco
#psyco.full

from datetime import datetime
args = [k for k in range(10000000)]

def f1:
','.join(str(a) for a in args)

def f2:
','.join([str(a) for a in args])

def f3:
','.join(map(lambda a: str(a args

t1 = datetime.now
f1
t2 = datetime.now
f2
t3 = datetime.now
f3
t4 = datetime.now

print t2-t1
print t3-t2
print t4-t3

без psyco:
t3-t2 <= t2-t1 < t4-t3
с psyco:
t3-t2 уменьшился в полтора раза
t2-t1 и t4-t3 увеличились в 2
Отсюда вывод: есть возможность по памяти - используйте list comprehensions, а map вообще не используйте
И отсюда же вопрос, что map+lambda так подкачал? Есть мысли?

vook

Просто через жопу map и lambda сделаны, вот и все. Компилятор должен инлайнить лямбда-функции по мере возможности. Ах да, в Питоне же нет компилятора

amkharchenko

Так вроде же даже сам GwR рассказывал, что comprehensions побыстрее map+lambda итп будут. Кстати, а чо psyco пользовать, PyPy еще не вобрал его функциональность в себя? Как там вообще JIT поживает?

Ober

Сцуко-диктатор вообще ненавидит лямбды!

tipnote

Просто через жопу map и lambda сделаны, вот и все
Вариант 1:

def f3:
','.join(map(str, args

Время выполнения резко упало и уступило только психованному f2
Вариант 2:

def lf(a):
return str(a)
def f3:
','.join(map(lf, args

Время выполнения примерно сравнялось с реализацией через лямбда.
Отсюда мораль: лямбда вряд ли через жопу сделана (относительно скорости выполнения ).
Апдейт общей морали: не использовать мап с самописными функциями (в том числе лямбда)

tipnote

Так вроде же даже сам GwR рассказывал, что comprehensions побыстрее map+lambda итп будут.
Дай ссылку на текток?
Кстати, а чо psyco пользовать, PyPy еще не вобрал его функциональность в себя? Как там вообще JIT поживает?
PyPy, вроде, пока не включает в себя джит, хотя обещают "вот-вот", сам же PyPy "всего лишь" в 2 раза в cреднем (по словам разрабов же) медленнее CPython
Да и вообще, PyPy пока совсем не мейнстрим, стремно с ним работать

tipnote

Сцуко-диктатор вообще ненавидит лямбды!
Да ладно, просто они не вписываются в текущий питоновский синтаксис, а ради лямбд он не готов усложнять его.

amkharchenko

В общем, вот оно.
I think dropping filter and map is pretty uncontroversial; filter(P, S) is almost always written clearer as [x for x in S if P(x)], and this has the huge advantage that the most common usages involve predicates that are comparisons, e.g. x==42, and defining a lambda for that just requires much more effort for the reader (plus the lambda is slower than the list comprehension).

tipnote

О, great thx!

Ober

В текущий питоновский синтаксис оно отлично вписывается, а вот в фантазии диктатора — не очень. Но он в чём-то несомненно прав насчёт простоты языка.

tipnote

В текущий питоновский синтаксис оно отлично вписывается, а вот в фантазии диктатора — не очень.
Да неужели?
Ну, предложи мне вариант multi-statement lambda.

Ober

Ну, предложи мне вариант multi-statement lambda.
То, что такого нет, я понимаю (и то, что в lambda вообще нет ни одного statement хорошо хоть multiline разрешили для выражений. В своих постах я имел в виду то, что те лямбды, которые можно записывать в текущем синтаксисе питона, очень даже в него вписываются, но, тем не менее, диктатор был настроен против них (как сейчас — не знаю).

tipnote

Значит, я тебя просто не так понял.
А из чего тогда ты сделал вывод, что
диктатор был настроен против них
?
Лямбда с функционалом в рамках синтаксиса существует, реализация работает, вроде, почти как любая другая самописная nested функция.

Ober

А из чего тогда ты сделал вывод
Ну там, насколько я помню, в списках рассылки было несколько довольно горячих обсуждений насчёт выкидывания lambda, map, filter, reduce... Ещё навскидку можно найти пост в блоге. Вот с того момента мне как-то не по себе стало за лямбды, хотя, с другой стороны, точка зрения диктатора видится как достаточно рациональная...

tipnote

Ну там, насколько я помню, в списках рассылки было несколько довольно горячих обсуждений насчёт выкидывания lambda, map, filter, reduce... Ещё навскидку можно найти пост в блоге. Вот с того момента мне как-то не по себе стало за лямбды, хотя, с другой стороны, точка зрения диктатора видится как достаточно рациональная...
Ну, я просто не назвал бы это "против лямбда". Для случаев, когда можно написать "лучше" без лямбда - лямбду убираем. Там, где нельзя - не убираем. Ничего враждебного
К примеру, на каждый случай типа:

try:
_ = gettext('xx','ru')
except IOError,ex:
_ = lambda x: x

никто не будет вводить дополнительную встроенную функцию. Случаев много - обзадолбаются
так что, имхо, никуда она не денется, эта лямбда

Ober

Для случаев, когда можно написать "лучше" без лямбда - лямбду убираем. Там, где нельзя - не убираем.
Ну к такому подходу только +1, скорее всего

Olenenok

горячих обсуждений насчёт выкидывания lambda, map, filter, reduce...
а это зачем? захотелось интерпретируемый аналог паскаля получить?

Ober

Ну, почитай ту ссылку на блог; на архивы рассылки мне что-то лень искать, но там реально дофига было и на форумах ещё каких-то точно было... В блоге диктатор вроде более-менее нормально излагает свою позицию, но кратко, в обсуждениях тема выбрасывания лямбд, конечно, лучше раскрывалась.
Оставить комментарий
Имя или ник:
Комментарий: