Въпроси за ефективност

  1. Силно се надявам това да не се окаже темата за flamewars, както обикновено става в такива случаи :)

    Да я захвана с въпрос относно списъци. Прието ли е да се смята, че дължината на един списък се пази някак отделно от самите му елементи, т.е. че може да бъде върната лесно, бързо и веднага, без обхождане на елементите, за да бъдат преброени?

    Конкретният случай, заради който задавам въпроса, е такъв: кое ще се изпълни по-бързо за голям брой елементи в списъка:

    if len(lst) > 500:
        ...
    

    или:

    if not lst[0] is None:
        ...
    

    (да, ясно ми е, че на доста хора ще им стане ясно това, което не доизказвам - същинската причина да задавам въпроса ;) Също така ми е ясно, че за конкретния случай, заради който ми хрумна този въпрос, вероятно дължината на списъка няма да е твърде голяма и дори len() би се изпълнило за, как да кажа, "разумно" време :P Така че това попада в категорията "микрооптимизации преди изобщо да си разбрал дали имаш проблем"... но ми е интересен отговорът по принцип: дали len(списък) се пази някъде във вътрешното представяне на списъка или всеки път го обхожда)

    Публикувано преди
  2. Като имам такива чуденки, гледам в кода на Python. Можеш да видиш listobject.c и listobject.h.

    Списъците в Python са имплементирани като C масиви. Размера им се взема в константно време. len([1, 2, 3])не обхожда, а връща изчислено число.

    Това отговаря ли ти на въпроса? :)

    Публикувано преди
  3. Мдам, и моят първи инстинкт е UTSL, но това щеше да ми даде две неща по-малко:

    • щях да имам поглед само върху една реализация на Python (да, the reference implementation, така е, но все пак :)
    • нямаше да знам дали няма нещо общоизвестно сред програмистите на Python, така както примерно за C се знае, че за превръщане на цяло число в низ хич не е добра идея да ползваш itoa() (изобщо не е portable), по принцип не е много добра идея да ползваш sprintf(), ако не си съвсем сигурен точно колко е голямо числото, така че да не си напишеш сам някой buffer overflow, мооооже да ползваш sprintf(), макар че и той е бавен, а най-добре да ползваш strtol() :) Такива видове неща, които се чуват в обсъждания в процеса на работа, с месеци и години, и "новите" хора просто още не са попаднали на тях.

    Но, да, това, че len() за списък работи в константно време отговаря на въпроса ми, благодаря :)

    Публикувано преди
  4. Ами, това е trade-off-а като скочиш на такъв език -- жертваш скорост, но не се занимаваш с buffer overflow, заделяне на памет и всякакви други неща.

    Обикновено най-простия начин да наприш нещо в Python е и най-ефективен. Ако не е така -- или трябва да го преживееш някак или може би решаваш проблем, който по-добре ще се реши на друг език.

    П.П.: Форума форматира с Markdown. Виж как съм ти едитнал поста и помисли дали не те кефи повече :)

    Публикувано преди
  5. Да, знам за Markdown и дори използвам някои от форматите му в някои от мненията си :) Просто не се бях замислял изобщо за форматиране на кода.

    Публикувано преди

Трябва да сте влезли в системата, за да може да отговаряте на теми.