![]() |
performance - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: General Coding Help (https://python-forum.io/forum-8.html) +--- Thread: performance (/thread-21609.html) |
performance - kerzol81 - Oct-07-2019 Hi, Do you know any good diagnostic tool to compare 2 implementations? First: def converterA(qdate, qtime): """ :param qdate: DDMMYY :param qtime: HHMMSS :return: YY-MM-DD HH-MM-SS """ if not isinstance(qdate, str) or not isinstance(qtime, str): raise TypeError("parameters must be strings and valid datetime format (qdate: DDMMYY; qtime: HHMMSS)") from datetime import datetime return str(datetime.strptime(qdate + qtime, '%d%m%y%H%M%S'))Second: def converterB(qdate, qtime): """ :param qdate: DDMMYY :param qtime: HHMMSS :return: YY-MM-DD HH-MM-SS """ if not isinstance(qdate, str) or not isinstance(qtime, str): raise TypeError("parameters must be strings and valid datetime format (qdate: DDMMYY; qtime: HHMMSS)") """ :param qdate: DDMMYY :param qtime: HHMMSS :return: YY-MM-DD HH-MM-SS """ day = qdate[:2] month = qdate[2:4] year = '20{}'.format(qdate[4:]) hour = qtime[:2] minute = qtime[2:4] second = qtime[4:] return '{}-{}-{} {}:{}:{}'.format(year, month, day, hour, minute, second)I'd like to know which one is faster. According to unittest the 2nd one, but is this reliable? import unittest from converter import * class ConverterB(unittest.TestCase): def test_valids(self): for i in range(10000000): self.assertEqual(converterB("021020", "010000"), "2020-10-02 01:00:00") RE: performance - buran - Oct-07-2019 from datetime import datetime import struct import timeit def convert_1(qdate, qtime): return str(datetime.strptime(qdate + qtime, '%d%m%y%H%M%S')) def convert_2(qdate, qtime): day = qdate[:2] month = qdate[2:4] year = f'20{qdate[4:]}' #'20{}'.format(qdate[4:]) hour = qtime[:2] minute = qtime[2:4] second = qtime[4:] return f'20{year}-{month}-{day} {hour}:{minute}:{second}' #return '{}-{}-{} {}:{}:{}'.format(year, month, day, hour, minute, second) def convert_3(qdate, qtime): fmt_string = '2s2s2s' # converts unicode input to byte string and results back to unicode string field_struct = struct.Struct(fmt_string) unpack = field_struct.unpack_from parse = lambda line: tuple(s.decode().strip() for s in unpack(line.encode())) year, month, day = parse(qdate) hour, minute, second = parse(qtime) return f'20{year}-{month}-{day} {hour}:{minute}:{second}' print(timeit.timeit('convert_1("021020", "010000")', setup='from __main__ import convert_1', number=100000)) print(timeit.timeit('convert_2("021020", "010000")', setup='from __main__ import convert_2', number=100000)) print(timeit.timeit('convert_3("021020", "010000")', setup='from __main__ import convert_3', number=100000))with your implementation in coonvert_2: with f-strings yes, it looks it's the fastest oneYou can gain slightly more if you use f-strings |