Обновить
8
0

Пользователь

Отправить сообщение
А можно детальнее про то как реализована portable версия программы?
Раз у вас на каком то этапе используется msi, то это подразумевает регистрацию компонентов в реестре. Каждый компонент(в WIX'e тег Component) отдельно регестрируется в реестре для корректного обновления/удаления.
вообще решение я писал в лоб
старался только минимум логики реализовывать на python'е и максимально использовать builtin объекты
по сути оно так и вышло, на питоне только доступ к атрибутам и вызов методов

что касается лишней памяти: я так думаю если вместо ключа хранить хэш инстанса ключа hash(key), то потери будут сильно меньше
на эту тему есть уже например тут
ради интереса сделал тест используя django
from django.db import models

def buildDjangoObject():
    class DjangoObject(models.Model):
        class Meta:
            app_label = ''
    DjangoObject.Id = models.IntegerField()
    for x in xrange(ColsCount):
        setattr(DjangoObject, "Col{0}".format(x), models.TextField())
    return DjangoObject

DjangoObject = buildDjangoObject()
и
def test5(self):
    return tuple(row for row in DjangoObject.objects.raw(self.query))

результаты:
Sample 1(tuple): 5.4720143202
Sample 2(RowWrapper): 19.0111270981
Sample 3(TupleClass): 5.80622400633
Sample 4(dict): 8.65782098053
Sample 5(django.model + raw()): 13.5116426081

обновлённый пример целиком тут
писал в два подхода, возможно в фоне что то работало(тот же антивирус например)
вдогонку такая реализация кеша

class ListDictBasedCache(object):
    __slots__ = ['__key2value', '__maxCount', '__weights']
    def __init__(self, maxCount):
        self.__maxCount = maxCount
        self.__key2value = {}# key->value
        self.__weights = []# keys ordered in LRU

    def __updateWeight(self, key):
        try:
            self.__weights.remove(key)
        except ValueError:
            pass
        self.__weights.append(key)# add key to end
        if len(self.__weights) > self.__maxCount:
            _key = self.__weights.pop(0)# remove first key
            self.__key2value.pop(_key)

    def __getitem__(self, key):
        try:
            value = self.__key2value[key]
            self.__updateWeight(key)
            return value
        except KeyError:
            raise KeyError("key %s not found" % key)

    def __setitem__(self, key, value):
        self.__key2value[key] = value
        self.__updateWeight(key)

    def __str__(self):
        return str(self.__key2value)


замеры на вашем тесте
DictBasedCache: min 0.00702, max 0.00785, avg 0.00721
FastCache: min 0.13259, max 0.13793, avg 0.13528
ListDictBasedCache: min 0.07482, max 0.07965, avg 0.07638
ODCache: min 0.16472, max 0.16917, avg 0.16693

здесь для сравнения добавлен DictBasedCache для сравнения с обычным словарём
class DictBasedCache(dict):
    def __init__(self, cacheSize):
        self.cacheSize = cacheSize
        dict.__init__(self)
Внимательнее! 4) быстрее чем 2) но медленнее чем 3)
быстрее как раз не получилось
def test4(self):
    return tuple(dict(zip(Columns, row)) for row in self.cursor.execute(self.query))

Результат:
Sample 1: 4.27413250617
Sample 2: 15.0353127761
Sample 3: 4.66455941441
Sample 4: 6.84044835724
Для НЕ python программиста очень даже неочевидно. Наверное зря я не указал это в тексте.
А по запросу python namedtuple не выдаёт эту статью.
Фраза в заголовке " для не Python программиста" показалась лишней информацией. Кто разбирается в теме просмотрит и быстро пролистнёт дальше.
Это было требование к задаче. Само собой решение на stored procedure предлагалось… Пришлось крутиться.
Класс в общем то не нужен. Нужна возможность обратиться к колонке по имени.
value = getattr(rowObject, «ColumnName»)
логичным видится замапить результат query на class

В реальной задаче правила проверки лежали в базе в виде (упрощённо)
таблица | имя колонки | операция | значение

Информация

В рейтинге
Не участвует
Откуда
Минск, Минская обл., Беларусь
Зарегистрирован
Активность