Интересует вопрос: насколько применение map дает выигрыш по скорости по сравнению с обычным for? Т.е. в теории оно, наверное, должно давать, а на практике — есть у кого-нибудь опыт применения, может кто-то видел в литературе оценки? Заранее спасибо.
Здравствуйте, Аноним, Вы писали:
А>Интересует вопрос: насколько применение map дает выигрыш по скорости по сравнению с обычным for? Т.е. в теории оно, наверное, должно давать, а на практике — есть у кого-нибудь опыт применения, может кто-то видел в литературе оценки? Заранее спасибо.
Тут надо сравнивать не с обычным for, который конечно же медленее, а с list comprehension (LC). Тогда если у вас есть какой-то внешний функтор, то они практически равносильны. А вот если у вас lambda, то лучше LC, потому что он не будет тратить время на её вызов при каждой итерации.
Но в любом случае, если вы озаботились этим вопросом, то возможно, вы выбрали совсем не тот инструмент.
> Но в любом случае, если вы озаботились этим вопросом, то возможно, вы > выбрали совсем не тот инструмент.
Согласен.
Это "синтаксический сахар" основная цель которого, повысить читабельность
программы, а на производительность он влияет крайне слабо.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Python: map vs for
От:
Аноним
Дата:
05.03.09 14:23
Оценка:
Здравствуйте, DemAS, Вы писали:
>> Но в любом случае, если вы озаботились этим вопросом, то возможно, вы >> выбрали совсем не тот инструмент.
DAS>Согласен.
Охохо, и когда же на РСДНе перестанут на вопрос "как сделать то-то и то-то" отвечать вопросом "А нафиг тебе это надо?"....
DAS>Это "синтаксический сахар" основная цель которого, повысить читабельность DAS>программы, а на производительность он влияет крайне слабо.
"-Где факты? — возмущенно закричал капитан.
-Да вот, вчера...... у боцмана в......, чувствую — ..... попахивает.....
"
(из обсцентного морского юмора)
Это я к тому, что мне тоже так показалось по результатам собственного эксперимента, но — может что-то не так делаю, и на самом деле скорость при использовании map и reduce должна возрастать?
"Аноним 336" <0@users.rsdn.ru> writes:
> DAS>Согласен. > Охохо, и когда же на РСДНе перестанут на вопрос "как сделать то-то и то-то" отвечать вопросом "А нафиг тебе это надо?"....
1) А где вопрос "как сделать то-то и то-то"?
2) А где ответ "А нафиг тебе это надо?"?
Вопрос был — "правда ли что выигрыша в скорости нет".
Ответ был — "да, выигрыша в скорости нет".
Вопроса, "как получить выигрыш в скорости" я не увидел.
> "-Где факты? — возмущенно закричал капитан.
[...] > Это я к тому, что мне тоже так показалось по результатам собственного > эксперимента, но — может что-то не так делаю,
Для меня правильно поставленный эксперимент является одним из фактов на
основании которого я делаю для себя вывод.
Posted via RSDN NNTP Server 2.1 beta
Re[5]: Python: map vs for
От:
Аноним
Дата:
05.03.09 15:09
Оценка:
Здравствуйте, DemAS, Вы писали:
DAS>Вопроса, "как получить выигрыш в скорости" я не увидел.
Цитата:
Интересует вопрос: насколько применение map дает выигрыш по скорости по сравнению с обычным for? Т.е. в теории оно, наверное, должно давать, а на практике — есть у кого-нибудь опыт применения, может кто-то видел в литературе оценки? Заранее спасибо.
Так вот, ни опыта применения, ни ссылок на литературу я в ответ не получил. Только, прости, общие слова про "синтаксический сахар".
DAS>Для меня правильно поставленный эксперимент является одним из фактов на DAS>основании которого я делаю для себя вывод.
Если б я был на 100% (ну, не буду жадничать, на 99,99%) уверен, что я все правильно делаю — я бы и не стал писать в форум. Меня интересует ,повторяю еще раз, личный опыт автора либо ссылки на авторитетный источник (Гвидо Ван подойдет вполне).
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, DemAS, Вы писали:
А>Если б я был на 100% (ну, не буду жадничать, на 99,99%) уверен, что я все правильно делаю — я бы и не стал писать в форум. Меня интересует ,повторяю еще раз, личный опыт автора либо ссылки на авторитетный источник (Гвидо Ван подойдет вполне).
"Аноним 336" <0@users.rsdn.ru> writes:
> Цитата: > Интересует вопрос: насколько применение map дает выигрыш по скорости по сравнению с обычным for? Т.е. в теории оно, наверное, должно давать, а на практике — есть у кого-нибудь опыт применения, может кто-то видел в литературе оценки? Заранее спасибо.
Ну а чем мой первоначальный ответ не вписался в этот вопрос?
Опыт имел. Увеличения скорости не заметил. Более того, не ожидал его даже
увидеть, ибо данная синтаксическая конструкция создавалась не для
увеличения производительности.
> Так вот, ни опыта применения, ни ссылок на литературу я в ответ не получил. Только, прости, общие слова про "синтаксический сахар".
Ну, ссылок у меня не осталось. Но общими словами идею, славу богу, выразить
я пока могу
Здравствуйте, Аноним, Вы писали:
А>Интересует вопрос: насколько применение map дает выигрыш по скорости по сравнению с обычным for? Т.е. в теории оно, наверное, должно давать, а на практике — есть у кого-нибудь опыт применения, может кто-то видел в литературе оценки? Заранее спасибо.
Вот, я набросал маленький пример:
""" Module for testing map performance. """
from math import sin, pi, exp
FUN = lambda x: exp(sin(pi/1.0 * x))
RANGE = xrange(1000)
def test_map():
""" Test map function. """
return map(FUN, RANGE)
def test_comprehension():
""" Test list comprehension. """
return [FUN(item) for item in RANGE]
def test_for():
""" Test usual for statement. """
result = []
for item in RANGE:
result.append(FUN(item))
return result
TESTS = ('test_map', 'test_comprehension', 'test_for')
def main():
""" The entry point. """
from timeit import Timer
timer = lambda test: Timer('%s()' % test, 'from __main__ import %s' % test)
output = lambda test: '%s: %f' % (test, timer(test).timeit(number = 1000))
print '\n'.join(output(test) for test in TESTS)
if __name__ == '__main__':
main()
Запустил три раза (сам timeit прогоняет функции по 1000 раз, но можно поставить любое другое число), получил следующее:
Т.е. скорость map и list comprehension сопоставима, for — медленнее. Но for делает append для списка (чтобы полностью продублировать функциональность), что и сказывается на тормозах. А вообще все рекомендуют юзать именно list comprehension, а pylint даже ругается на использование map.
Re[2]: Python: map vs for
От:
Аноним
Дата:
06.03.09 07:47
Оценка:
Здравствуйте, Nuald, Вы писали:
.....
Я позволил себе несколько нарушить Ваш копирайт (надеюсь, Ваш код распространяется на правах GPL? ) и на основе Вашего кода написал следующее:
""" Module for testing map performance. """
from math import sin, pi, exp
FUN = lambda x: exp(sin(pi/1.0 * x))
N = 100000
RANGE = xrange(N)
def test_map():
""" Test map function. """
return map(FUN, RANGE)
def test_comprehension():
""" Test list comprehension. """
return [FUN(item) for item in RANGE]
def test_for():
""" Test usual for statement. """
result = []
for item in RANGE:
result.append(FUN(item))
return result
def test_for_smart():
""" Test optimized for statement. """
result = [None] * N
for item in RANGE:
result[item] = FUN(item)
return result
TESTS = (test_map, test_comprehension, test_for, test_for_smart)
def main():
""" The entry point. """
from profile import Profile
for case in TESTS:
profiler = Profile()
profiler.runcall(case)
profiler.print_stats()
if __name__ == '__main__':
main()
Итого: map и LC практически дают одно и то же (формально LC даже проигрывает 4ms, хотя эта разница уже в рамках погрешности), for с append-ом резко отстает, for без append-а —
тоже тормознее, хотя и не так сильно