mpd

Производительность кода на Python из командной строки

Mar 29, 2020 19:59

Если захотите поиграться с производительностью какого-нибудь кода на питоне прямо из командной строки, вот на примере из предыдущего поста:
$ python -m timeit -s 'a,b,c = "a", "b", "d"' '"%s%s%s" % (a, b, c)'
10000000 loops, best of 3: 0.153 usec per loop
$ python -m timeit -s 'a,b,c = "a", "b", "d"' 'a + b + c'
10000000 loops, best of 3: 0.0818 usec per loop
$ python -m timeit -s 'a,b,c = "a", "b", "d"' 'f"{a}{b}{c}"'
10000000 loops, best of 3: 0.0668 usec per loop
$ python -m timeit -s 'a,b,c = "a", "b", "d"' '"{}{}{}".format(a, b, c)'
1000000 loops, best of 3: 0.286 usec per loopМодуль timeit входит в стандартную поставку питона.
Параметр -s позволяет задать начальные условия, которые будут использованы на каждой итерации.

P.S.: Показания выше - были для Python 3.6.10 (default, Mar 22 2020, 04:35:52) [GCC 9.2.0]
Linux maxmsi 4.19.97-gentoo #3 SMP Wed Mar 18 18:23:29 CET 2020 x86_64 Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz GenuineIntel GNU/Linux

Теперь для Python 3.7.7 (default, Mar 29 2020, 19:50:40) [GCC 9.2.0], расширенные и с расшифровкой:

$ python3.7 -m timeit --verbose --number 5000000 --setup 'a,b,c = "a", "b", "d"' \
> 'a + b + c'
raw times: 461 msec, 460 msec, 469 msec, 463 msec, 478 msec

5000000 loops, best of 5: 91.9 nsec per loop
$ python3.7 -m timeit --verbose --number 5000000 --setup 'a,b,c = "a", "b", "d"' \
> '"".join((a, b, c))'
raw times: 614 msec, 627 msec, 637 msec, 648 msec, 647 msec

5000000 loops, best of 5: 123 nsec per loop
$ python3.7 -m timeit --verbose --number 5000000 --setup 'a,b,c = "a", "b", "d"; import io' \
> 'with io.StringIO("", "") as n: n.write(a); n.write(b); n.write(b); n.getvalue()'
raw times: 5.76 sec, 5.9 sec, 6 sec, 5.87 sec, 6.06 sec

5000000 loops, best of 5: 1.15 usec per loop
$ python3.7 -m timeit --verbose --number 5000000 --setup 'a,b,c = "a", "b", "d"' \
> '"%s%s%s" % (a, b, c)'
raw times: 841 msec, 855 msec, 857 msec, 856 msec, 857 msec

5000000 loops, best of 5: 168 nsec per loop
$ python3.7 -m timeit --verbose --number 5000000 --setup 'a,b,c = "a", "b", "d"' \
> '"{}{}{}".format(a, b, c)'
raw times: 1.49 sec, 1.5 sec, 1.51 sec, 1.51 sec, 1.5 sec

5000000 loops, best of 5: 298 nsec per loop
$ python3.7 -m timeit --verbose --number 5000000 --setup 'a,b,c = "a", "b", "d"' \
> 'f"{a}{b}{c}"'
raw times: 367 msec, 400 msec, 376 msec, 372 msec, 373 msec

5000000 loops, best of 5: 73.4 nsec per loop
Т.е., самый худший вариант у io.StringIO.
Самый лучший - 73.4 nsec - у f-string.
Но на втором месте - 91.9 nsec - именно у obvious way.

Это всё ни в коем случае не доказать что-то или вступать в спор, объяснять почему...
Мне был и остаётся очень интересным именно психологический момент, человеческий аспект всей этой истории!
Почему? Потому, что программы пишутся для программистов!

(
| Комментировать в Dreamwidth)

console, python, performance

Previous post Next post
Up