LINUX.ORG.RU

Python. Оптимизация кода

 


2

3

По питону в основном работал с Odoo и стиль привил себе ихний. Но вот решил написать свой маленький костыль для гнома и решил почитать об производительности питона(не смейтесь) Полез читать https://wiki.python.org/moin/PythonSpeed/PerformanceTips

И почитав его возникло чувство, что Odoo антипатерн. И собственно вопрос - как лучше реализовать метод:

def getSettings(self):
        if self.settings != None:
            return self.settings
        self.settings = {}
        for section in self.parser:
            self.settings[section] = {}
            for parameter in self.parser[section]:
                self.settings[section][parameter] = self.parser[section][parameter]
или
def getSettings(self):
        if self.settings != None:
            return self.settings
        parser = self.parser
        self.settings = {
            section: {parameter:parser[section][parameter]}
            for section in parser 
            for parameter in parser[section]
            }

Первый вариант мне больше удобочитаем, но вот по производительности, если словари очень большие - будет ли выигрыш?

★★

Последнее исправление: webmak (всего исправлений: 1)

Мне думается разница будет в пределах погрешности. Если действительно интересно — профилируй.

PolarFox ★★★★★
()
Ответ на: комментарий от deadNightTiger

Там расширение сишное, так не дает. Но суть вопроса не в оптимизации моей оптимизации)

webmak ★★
() автор топика

И собственно вопрос - как лучше реализовать метод

Видимо, так:

def getSettings(self):
    if self.settings is None:
        self.settings = {
            section: {
                parameter: value
                for (parameter, value) in parameters.items()
            }
            for (section, parameters) in self.parser.items()
        }
    return self.settings

но вот по производительности, если словари очень большие - будет ли выигрыш?

Раза в полтора. Самому профильнуть сложно, что ли?

Esper
()

Иди к доске и напиши 100 раз, чтобы видели все:

Я НЕ БУДУ ЗАНИМАТЬСЯ ПРЕЖДЕВРЕМЕННОЙ ОПТИМИЗАЦИЕЙ, ПОКА НЕ ВЫЯВЛЮ УЗКОЕ МЕСТО С ПОМОЩЬЮ ПРОФАЙЛЕРА.
Я НЕ БУДУ ЗАНИМАТЬСЯ ПРЕЖДЕВРЕМЕННОЙ ОПТИМИЗАЦИЕЙ, ПОКА НЕ ВЫЯВЛЮ УЗКОЕ МЕСТО С ПОМОЩЬЮ ПРОФАЙЛЕРА.
Я НЕ БУДУ ЗАНИМАТЬСЯ ПРЕЖДЕВРЕМЕННОЙ ОПТИМИЗАЦИЕЙ, ПОКА НЕ ВЫЯВЛЮ УЗКОЕ МЕСТО С ПОМОЩЬЮ ПРОФАЙЛЕРА.
Я НЕ БУДУ ЗАНИМАТЬСЯ ПРЕЖДЕВРЕМЕННОЙ ОПТИМИЗАЦИЕЙ, ПОКА НЕ ВЫЯВЛЮ УЗКОЕ МЕСТО С ПОМОЩЬЮ ПРОФАЙЛЕРА.
Я НЕ БУДУ ЗАНИМАТЬСЯ ПРЕЖДЕВРЕМЕННОЙ ОПТИМИЗАЦИЕЙ, ПОКА НЕ ВЫЯВЛЮ УЗКОЕ МЕСТО С ПОМОЩЬЮ ПРОФАЙЛЕРА.
Я НЕ БУДУ ЗАНИМАТЬСЯ ПРЕЖДЕВРЕМЕННОЙ ОПТИМИЗАЦИЕЙ, ПОКА НЕ ВЫЯВЛЮ УЗКОЕ МЕСТО С ПОМОЩЬЮ ПРОФАЙЛЕРА.
Я НЕ БУДУ ЗАНИМАТЬСЯ ПРЕЖДЕВРЕМЕННОЙ ОПТИМИЗАЦИЕЙ, ПОКА НЕ ВЫЯВЛЮ УЗКОЕ МЕСТО С ПОМОЩЬЮ ПРОФАЙЛЕРА.
Я НЕ БУДУ ЗАНИМАТЬСЯ ПРЕЖДЕВРЕМЕННОЙ ОПТИМИЗАЦИЕЙ, ПОКА НЕ ВЫЯВЛЮ УЗКОЕ МЕСТО С ПОМОЩЬЮ ПРОФАЙЛЕРА.
Я НЕ БУДУ ЗАНИМАТЬСЯ ПРЕЖДЕВРЕМЕННОЙ ОПТИМИЗАЦИЕЙ, ПОКА НЕ ВЫЯВЛЮ УЗКОЕ МЕСТО С ПОМОЩЬЮ ПРОФАЙЛЕРА.
Я НЕ БУДУ ЗАНИМАТЬСЯ ПРЕЖДЕВРЕМЕННОЙ ОПТИМИЗАЦИЕЙ, ПОКА НЕ ВЫЯВЛЮ УЗКОЕ МЕСТО С ПОМОЩЬЮ ПРОФАЙЛЕРА.
Я НЕ БУДУ ЗАНИМАТЬСЯ ПРЕЖДЕВРЕМЕННОЙ ОПТИМИЗАЦИЕЙ, ПОКА НЕ ВЫЯВЛЮ УЗКОЕ МЕСТО С ПОМОЩЬЮ ПРОФАЙЛЕРА.
Я НЕ БУДУ ЗАНИМАТЬСЯ ПРЕЖДЕВРЕМЕННОЙ ОПТИМИЗАЦИЕЙ, ПОКА НЕ ВЫЯВЛЮ УЗКОЕ МЕСТО С ПОМОЩЬЮ ПРОФАЙЛЕРА.

anonymous
()

self.parser тоже словарь?

Попробуй так:

def getSettings(self):
    if self.settings != None:
        return self.settings
    
    settings = {}
    
    for section_name, section in self.parser:
        settings[section_name] = section.copy()

    self.settings = settings
    # return self.settings #?

anonymous
()
Ответ на: комментарий от webmak

Да как-то не заметил я выиграша при тестировании на 1 000 000 записей

У тебя 1 000 000 записей в конфиге? Ты поехавший?

anonymous
()
Ответ на: комментарий от webmak

Покажи весь кот и версию интерпретатора, мне аж интересно.

Esper
()
Ответ на: комментарий от webmak

Если ты читаешь из реального конфига, то у тебя, скорее всего, большая часть времени идёт на его парсинг. У меня на машине словарь 1000x1000 копируется этой функцией за ~500 миллисекунд, естественно, что на фоне твоего минутного парсинга разница незаметна. Оптимизатор, блин.

Esper
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.