Eleneldil G. Arilou (arilou) wrote,
Eleneldil G. Arilou
arilou

Category:

"Как много нам открытий чудных...."

Видим в чужом коде такую функцию и ужасаемся:
def reprList( _list, divider=',' ):
    param_string = ""
    if _list:
        for val in _list:
            param_string += repr(val) + divider
        return param_string[:-(len(divider))]
    return param_string

Тут же делаем свой вариант, который и короче, и понятнее:
def reprL( list_, divider=',' ):
    return divider.join(repr(val) for val in list_)


Затем берём модуль timeit, пробуем на нескольких примерах, и радость наша сменяется озадаченностью:


[]
reprList: 0.285995960236
reprL: 2.35047221184

(123, {'q': 'wleiweiruw', 12: 'asaqw'}, 'DWERwerwerwsdgerte', set([1, 2, 3, 4, 5]), 923842982)
reprList: 6.62340903282
reprL: 8.48656201363

[123, {'q': 'wleiweiruw', 12: 'asaqw'}, 'DWERwerwerwsdgerte', set([1, 2, 3, 4, 5]), 923842982]
reprList: 6.54594492912
reprL: 8.45274496078

['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'reprL', 'reprList', 'timeit']
reprList: 3.84632706642
reprL: 4.83487200737

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127]
reprList: 44.1687018871
reprL: 34.8512501717

['Timer', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_template_func', 'default_number', 'default_repeat', 'default_timer', 'dummy_src_name', 'gc', 'itertools', 'main', 'reindent', 'repeat', 'sys', 'template', 'time', 'timeit']
reprList: 9.64470481873
reprL: 9.28048801422


Н-да... создание итератора и передача его в join() отжрает времени больше, чем лишние локальные переменные и отрезание хвостового пробела в первом варианте функции, и выигрыш от join по сравненю с += перевешивает его только где-то с 20 элементов списка.

Несколько печалит, что компактная конструкция, сделанная как раз в стиле этого языка и на библиотечных методах тащит столько накладных расходов, что порой самостоятельно написанный "общеязыковой" вариант у неё выигрывает.

(Ещё несколько удивляет, что цикл и итератор по списку работают чуть быстрее, чем по кортежу, ну да ладно.)


This entry was originally posted at http://arilou.dreamwidth.org/931852.html. Please comment there using OpenID.
Tags: python, программирование
Subscribe

  • И ещё из рабочих моментов...

    Из рабочего скайп-чата: "В одном чате сидят два Хаоса, три Саши, один Валя, один Даня и один Эль. Сколько всего людей в чате?" This entry was…

  • Вот он, культурный контекст ;)

    В процессе обсуждения некоторых деталей нашей игры: Я: Неплохо бы сообщать игроку, кто его убил. И вообще в писать, кто кого в бою убил. Хаосмаг…

  • Запустились

    Сегодня открыли для общего доступа бета- (или честнее сказать, альфа-) версию нашей игры на новом сервере, писанном вашим покорным слугой и его…

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 13 comments

  • И ещё из рабочих моментов...

    Из рабочего скайп-чата: "В одном чате сидят два Хаоса, три Саши, один Валя, один Даня и один Эль. Сколько всего людей в чате?" This entry was…

  • Вот он, культурный контекст ;)

    В процессе обсуждения некоторых деталей нашей игры: Я: Неплохо бы сообщать игроку, кто его убил. И вообще в писать, кто кого в бою убил. Хаосмаг…

  • Запустились

    Сегодня открыли для общего доступа бета- (или честнее сказать, альфа-) версию нашей игры на новом сервере, писанном вашим покорным слугой и его…