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

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

Видим в чужом коде такую функцию и ужасаемся:
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
  • 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