А можно детальнее про то как реализована 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))
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)
Класс в общем то не нужен. Нужна возможность обратиться к колонке по имени.
value = getattr(rowObject, «ColumnName»)
логичным видится замапить результат query на class
В реальной задаче правила проверки лежали в базе в виде (упрощённо)
таблица | имя колонки | операция | значение
Раз у вас на каком то этапе используется msi, то это подразумевает регистрацию компонентов в реестре. Каждый компонент(в WIX'e тег Component) отдельно регестрируется в реестре для корректного обновления/удаления.
старался только минимум логики реализовывать на python'е и максимально использовать builtin объекты
по сути оно так и вышло, на питоне только доступ к атрибутам и вызов методов
что касается лишней памяти: я так думаю если вместо ключа хранить хэш инстанса ключа hash(key), то потери будут сильно меньше
ради интереса сделал тест используя django
и
результаты:
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
обновлённый пример целиком тут
замеры на вашем тесте
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 для сравнения с обычным словарём
Результат:
Sample 1: 4.27413250617
Sample 2: 15.0353127761
Sample 3: 4.66455941441
Sample 4: 6.84044835724
value = getattr(rowObject, «ColumnName»)
логичным видится замапить результат query на class
В реальной задаче правила проверки лежали в базе в виде (упрощённо)
таблица | имя колонки | операция | значение