Форум сайта python.su
0
Здравствуйте. Помоги пож-та советами.
Есть список, кортеж, словарь, множество генерируемые рандомно функцией 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
Офлайн
24
Офлайн
0
Это я уже смотрел. Мне нужно изменить профайлер.
Офлайн
0
Помогите пож-та.
Упростил не много код:
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
Офлайн
0
Пока профайлер просто выводит время работы цикла, вот в этой строке:
print(self._message_format.format(time.time() - self._startTime))
Офлайн
857
>>> 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)
Офлайн