Найти - Пользователи
Полная версия: Переработка менеджера контекста
Начало » Python для новичков » Переработка менеджера контекста
1
MSunov
Здравствуйте. Помоги пож-та советами.
Есть список, кортеж, словарь, множество генерируемые рандомно функцией 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
ayb
https://docs.python.org/2/library/timeit.html
MSunov
Это я уже смотрел. Мне нужно изменить профайлер.
MSunov
Помогите пож-та.
Упростил не много код:
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?
MSunov
Пока профайлер просто выводит время работы цикла, вот в этой строке:
print(self._message_format.format(time.time() - self._startTime))
А нужно его записать в _time1 объекта Result
py.user.next
>>> 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>
>>> 
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB