Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 28, 2016 15:03:32

MSunov
Зарегистрирован: 2016-02-28
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Переработка менеджера контекста

Здравствуйте. Помоги пож-та советами.
Есть список, кортеж, словарь, множество генерируемые рандомно функцией get_random_hash
Есть 3 списка for_check1, for_check2, for_check3. тоже рандомные.
Проверить на вхождение элементов списка, кортежа, словаря, множества в for_check1, for_check2, for_check3.
Измерить время проверки и записать в _time1, _time2, _time3
Вывести время для каждой проверки в виде понятном для человека таблице
Как лучше реализовать все это?

Дан базовый профайлер из старой задачи.
Пока есть только вот такие наброски кода:

import time
import random
class Profiler:
    """Базовый профайлер, для реализации задачи потребует переработки"""
    def __init__(self, message_format='{:.3f} sec'):
        self._message_format = message_format
    def __enter__(self,):
        self._startTime = time.time()
    def __exit__(self, rtype, value, traceback):
        print(self._message_format.format(time.time() - self._startTime))
class Result:
    def __init__(self, name):
        self.name = name
        self._time1 = None
        self._time2 = None
        self._time3 = None
def get_random_hash(chars: str='ABCDEFGHIJKLMNPQRSTUVWXYZ0123456789', length: int=8) -> str:
    """
    Функция генерации случайного значения
    ARGUMENTS:
        :param chars: строка для формирования уникальной строки
        :param length: длинна генерируемого выходного значения
    """
    return ''.join(random.choice(chars) for letter in range(length))
BASE_LEN = 10000
CHECK_LEN = BASE_LEN * 10
base = [get_random_hash(length=5) for x in range(BASE_LEN)]
l = base[:]
t = tuple(base)
d = dict.fromkeys(base)
s = set(base)
for_check1 = [get_random_hash(length=4) for x in range(CHECK_LEN)]
for_check2 = [get_random_hash(length=5) for x in range(CHECK_LEN)]
for_check3 = base * (CHECK_LEN // BASE_LEN)
results = []
############################################################################
# List
############################################################################
result = Result('List')
results.append(result)
with Profiler():
    for x in for_check1:
        if x in l:
            pass
with Profiler():
    for x in for_check2:
        if x in l:
            pass
with Profiler():
    for x in for_check3:
        if x in l:
            pass
############################################################################
# Tuple
############################################################################
result = Result('Tuple')
results.append(result)
with Profiler():
    for x in for_check1:
        if x in t:
            pass
with Profiler():
    for x in for_check2:
        if x in t:
            pass
with Profiler():
    for x in for_check3:
        if x in t:
            pass
############################################################################
# Dict
############################################################################
result = Result('Dict')
results.append(result)
with Profiler():
    for x in for_check1:
        if x in d.keys():
            pass
with Profiler():
    for x in for_check2:
        if x in d.keys():
            pass
with Profiler():
    for x in for_check3:
        if x in d.keys():
            pass
############################################################################
# Set
############################################################################
result = Result('Set')
results.append(result)
with Profiler():
    for x in for_check1:
        if x in s:
            pass
with Profiler():
    for x in for_check2:
        if x in s:
            pass
with Profiler():
    for x in for_check3:
        if x in s:
            pass
###########################################################################
# TABLE
###########################################################################
# Организовать таблицы в человекочитаемом виде,
#  воспользоваться для этого синтаксисом форматирования строк используемом в format
# Вывод данных о времени(float) должен быть ограничен 3-мя знаками поле запятой
# вывод заголовков таблицы
for result in results:
    # вывод строк таблицы с результатами
    pass

Офлайн

#2 Фев. 28, 2016 15:09:37

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

Переработка менеджера контекста

Офлайн

#3 Фев. 28, 2016 15:16:49

MSunov
Зарегистрирован: 2016-02-28
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Переработка менеджера контекста

Это я уже смотрел. Мне нужно изменить профайлер.

Офлайн

#4 Фев. 28, 2016 21:50:19

MSunov
Зарегистрирован: 2016-02-28
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Переработка менеджера контекста

Помогите пож-та.
Упростил не много код:

class Profiler:
    """Базовый профайлер, для реализации задачи потребует переработки"""
    def __init__(self, message_format='{:.3f} sec'):
        self._message_format = message_format
 
    def __enter__(self,):
        self._startTime = time.time()
 
    def __exit__(self, rtype, value, traceback):
        print(self._message_format.format(time.time() - self._startTime))
 
 
class Result:
    def __init__(self, name):
        self.name = name
        self._time1 = None
 
base = [get_random_hash(length=5) for x in range(100)]
s = set(base)
for_check1 = [get_random_hash(length=4) for x in range(100)]
 
result = Result('Set')
with Profiler():
    for x in for_check1:
        if x in s:
            pass
Как записать время в переменную _time1?

Офлайн

#5 Фев. 28, 2016 22:17:15

MSunov
Зарегистрирован: 2016-02-28
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Переработка менеджера контекста

Пока профайлер просто выводит время работы цикла, вот в этой строке:

print(self._message_format.format(time.time() - self._startTime))
А нужно его записать в _time1 объекта Result

Офлайн

#6 Фев. 29, 2016 02:47:43

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Переработка менеджера контекста

>>> import time
>>> 
>>> class Profiler:
...     """Базовый профайлер, для реализации задачи потребует переработки"""
...     
...     def __init__(self, message_format='{:.3f} sec', result=None):
...         self._message_format = message_format
...         self._result = result
...     
...     def __enter__(self,):
...         self._startTime = time.time()
...     
...     def __exit__(self, rtype, value, traceback):
...         t = time.time() - self._startTime
...         if self._result is not None:
...             self._result.append(t)
...         print(self._message_format.format(t))
... 
>>> class Result:
...     def __init__(self, name, time_format='{:.3f} sec'):
...         self._name = name
...         self._time_format = time_format
...         self._times = []
...     
...     def append(self, t):
...         self._times.append(t)
...     
...     def __str__(self):
...         s = ', '.join(map(self._time_format.format, self._times))
...         return 'Result({})<{}>'.format(self._name, s)
... 
>>> r = Result('Test')
>>> 
>>> with Profiler(result=r):
...     time.sleep(1)
... 
1.001 sec
>>> with Profiler(result=r):
...     time.sleep(2)
... 
2.002 sec
>>> with Profiler(result=r):
...     time.sleep(3)
... 
3.003 sec
>>> print(r)
Result(Test)<1.001 sec, 2.002 sec, 3.003 sec>
>>> 



Отредактировано py.user.next (Фев. 29, 2016 02:55:02)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version