Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

ΠŸΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Python-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΈ Π°Π½Π°Π»ΠΈΠ· ΠΈΡ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ / Π₯Π°Π±Ρ€

ΠŸΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ β€” это Π½Π΅ΠΎΡ‚ΡŠΠ΅ΠΌΠ»Π΅ΠΌΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Ρ… Ρ€Π°Π±ΠΎΡ‚ ΠΏΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Π›ΡŽΠ±ΠΎΠΉ ΠΎΠΏΡ‹Ρ‚, Π»ΡŽΠ±Ρ‹Π΅ знания Π² сфСрС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΆΠ΅ Ρƒ вас Π΅ΡΡ‚ΡŒ, Π½Π΅ принСсут особой ΠΏΠΎΠ»ΡŒΠ·Ρ‹ Π² Ρ‚ΠΎΠΌ случаС, Ссли Π²Ρ‹ Π½Π΅ Π·Π½Π°Π΅Ρ‚Π΅ ΠΎ Ρ‚ΠΎΠΌ, Π³Π΄Π΅ ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ оказываСтся, Ρ‡Ρ‚ΠΎ поиск ΡƒΠ·ΠΊΠΈΡ… мСст ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π² Π΄Π΅Π»Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это быстро ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈΠ² Π½Π΅ слишком ΠΌΠ½ΠΎΠ³ΠΎ усилий.

Π’ этом ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π΅ ΠΌΡ‹ обсудим инструмСнты ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ способны ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΊΠΎΠ΄Π°, связанныС ΠΈ с рСсурсами процСссора, ΠΈ с ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ΠΌ памяти. Π—Π΄Π΅ΡΡŒ ΠΆΠ΅ ΠΌΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ (ΠΏΠΎΡ‡Ρ‚ΠΈ Π±Π΅Π·ΠΎ всяких усилий) простыС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ Π±ΠΎΡ€ΠΎΡ‚ΡŒΡΡ с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π­Ρ‚ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° Π΄Π°ΠΆΠ΅ Ρ‚ΠΎΡ‡Π½ΠΎ просчитанныС измСнСния ΠΊΠΎΠ΄Π° большС Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ.

Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ ΡƒΠ·ΠΊΠΈΡ… мСст

Π’ Π΄Π΅Π»Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π»Π΅Π½ΠΈΡ‚ΡŒΡΡ β€” это Ρ…ΠΎΡ€ΠΎΡˆΠΎ. ВмСсто Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ½ΡΡ‚ΡŒ Ρ‚ΠΎ, какая ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·Ρ‹ замСдляСт ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΌΠΎΠΆΠ½ΠΎ просто Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ инструмСнтами профилирования ΠΊΠΎΠ΄Π°. Они позволят Π½Π°ΠΉΡ‚ΠΈ Ρ‚Π΅ мСста прилоТСния, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ стоит ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‚Π°ΠΊΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π² Π±ΠΎΠ»Π΅Π΅ Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠΌ исслСдовании.

Π‘Π°ΠΌΡ‹ΠΉ распространённый инструмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ для этих Ρ†Π΅Π»Π΅ΠΉ Python-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ β€” это cProfile. Π­Ρ‚ΠΎ β€” стандартный ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ способСн ΠΈΠ·ΠΌΠ΅Ρ€ΡΡ‚ΡŒ врСмя выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π²ΠΎΠ·Π²ΠΎΠ΄ΠΈΡ‚ (ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ)Β eΒ Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒΒ X:

# some-code.py
from decimal import *
def exp(x):
Β Β Β Β getcontext().prec += 2
Β Β Β Β i, lasts, s, fact, num = 0, 0, 1, 1, 1
Β Β Β Β while s != lasts:
Β Β Β Β Β Β Β Β lasts = s
Β Β Β Β Β Β Β Β i += 1
Β Β Β Β Β Β Β Β fact *= i
Β Β Β Β Β Β Β Β num *= x
Β Β Β Β Β Β Β Β s += num / fact
Β Β Β Β getcontext().prec -= 2
Β Β Β Β return +s
exp(Decimal(3000))

Π˜ΡΡΠ»Π΅Π΄ΡƒΠ΅ΠΌ этот ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽΒ 

cProfile:

python -m cProfile -s cumulative some-code. py
Β Β Β Β Β Β Β Β Β 1052 function calls (1023 primitive calls) in 2.765 seconds
Β Β Β Ordered by: cumulative timek
Β Β Β ncallsΒ  tottimeΒ  percallΒ  cumtimeΒ  percall filename:lineno(function)
Β Β Β Β Β Β 5/1Β  Β  0.000Β  Β  0.000Β  Β  2.765Β  Β  2.765 {built-in method builtins.exec}
Β Β Β Β Β Β Β Β 1Β  Β  0.000Β  Β  0.000Β  Β  2.765Β  Β  2.765 some-code.py:1(<module>)
Β Β Β Β Β Β Β Β 1Β  Β  2.764Β  Β  2.764Β  Β  2.764Β  Β  2.764 some-code.py:3(exp)
Β Β Β Β Β Β 4/1Β  Β  0.000Β  Β  0.000Β  Β  0.001Β  Β  0.001 <frozen importlib._bootstrap>:986(_find_and_load)
Β Β Β Β Β Β 4/1Β  Β  0.000Β  Β  0.000Β  Β  0.001Β  Β  0.001 <frozen importlib._bootstrap>:956(_find_and_load_unlocked)
Β Β Β Β Β Β 4/1Β  Β  0.000Β  Β  0.000Β  Β  0.001Β  Β  0.001 <frozen importlib._bootstrap>:650(_load_unlocked)
Β Β Β Β Β Β 3/1Β  Β  0.000Β  Β  0.000Β  Β  0.001Β  Β  0.001 <frozen importlib._bootstrap_external>:842(exec_module)
Β Β Β Β Β Β 5/1Β  Β  0.000Β  Β  0.000Β  Β  0.001Β  Β  0.001 <frozen importlib._bootstrap>:211(_call_with_frames_removed)
Β Β Β Β Β Β Β Β 1Β  Β  0.000Β  Β  0.000Β  Β  0.001Β  Β  0.001 decimal.py:2(<module>)
.
..

Π’ΡƒΡ‚ ΠΌΡ‹ воспользовались ΠΎΠΏΡ†ΠΈΠ΅ΠΉΒ -s cumulative для сортировки Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ суммарному Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π·Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠΌΡƒ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π­Ρ‚ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ поиск ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Ρ‹Ρ… участков ΠΊΠΎΠ΄Π°. Π’ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‡Ρ‚ΠΈ всё врСмя (ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 2,764 сСкунды) Π² Ρ…ΠΎΠ΄Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ сСанса выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π±Ρ‹Π»ΠΎ ΠΏΠΎΡ‚Ρ€Π°Ρ‡Π΅Π½ΠΎ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΒ 

exp.

ΠŸΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ принСсти ΠΏΠΎΠ»ΡŒΠ·Ρƒ, Π½ΠΎ Π΅Π³ΠΎ, ΠΊ соТалСнию, Π½Π΅ всСгда достаточно.Β cProfile снабТаСт нас ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ лишь ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π½ΠΎ Π½Π΅ ΠΎΠ± ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… строках ΠΊΠΎΠ΄Π°. Если Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΡƒΡŽ-Ρ‚ΠΎ ΠΎΡΠΎΠ±ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π²Ρ€ΠΎΠ΄Π΅Β append, Π² Ρ€Π°Π·Π½Ρ‹Ρ… мСстах, Ρ‚ΠΎ свСдСния ΠΎΠ±ΠΎ всСх Π΅Ρ‘ Π²Ρ‹Π·ΠΎΠ²Π°Ρ… Π±ΡƒΠ΄ΡƒΡ‚ собраны Π² ΠΎΠ΄Π½ΠΎΠΉ строкС ΠΎΡ‚Ρ‡Ρ‘Ρ‚Π°Β cProfile. Π’ΠΎ ΠΆΠ΅ самоС относится ΠΈ ΠΊ скриптам, Π²Ρ€ΠΎΠ΄Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ исслСдовали Π²Ρ‹ΡˆΠ΅. Он содСрТит Π΅Π΄ΠΈΠ½ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая вызываСтся лишь ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρƒ

cProfile оказываСтся Π½Π΅ особСнно ΠΌΠ½ΠΎΠ³ΠΎ Π΄Π°Π½Π½Ρ‹Ρ… для формирования ΠΎΡ‚Ρ‡Ρ‘Ρ‚Π°.

Иногда такая Ρ€ΠΎΡΠΊΠΎΡˆΡŒ, ΠΊΠ°ΠΊ локальная ΠΎΡ‚Π»Π°Π΄ΠΊΠ° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, программисту Π½Π΅ доступна. Или Π±Ρ‹Π²Π°Π΅Ρ‚ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ, Ρ‡Ρ‚ΠΎ называСтся, Β«Π½Π° Π»Π΅Ρ‚ΡƒΒ», ΠΊΠΎΠ³Π΄Π° ΠΎΠ½Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ½-ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ. Π’ Ρ‚Π°ΠΊΠΈΡ… ситуациях ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌΒ py-spy. Π­Ρ‚ΠΎ β€” ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ, способный ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΆΠ΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½Ρ‹. НапримСр β€” прилоТСния, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ½Π΅, ΠΈΠ»ΠΈ Π½Π° любой ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎΠΉ систСмС:

pip install py-spy
python some-code.py &
[1] 1129587
ps -A -o pid,cmd | grep python
...
1129587 python some-code.py
1130365 grep python
sudo env "PATH=$PATH" py-spy top --pid 1129587

Π’ этом Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΊΠΎΠ΄Π° ΠΌΡ‹ сначала устанавливаСм py-spy, Π° ΠΏΠΎΡ‚ΠΎΠΌ, Π² Ρ„ΠΎΠ½Π΅, запускаСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая выполняСтся Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ врСмя. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ автоматичСскому ΠΏΠΎΠΊΠ°Π·Ρƒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° процСсса (PID), Π½ΠΎ Ссли ΠΌΡ‹ Π΅Π³ΠΎ Π½Π΅ Π·Π½Π°Π΅ΠΌ, ΠΌΠΎΠΆΠ½ΠΎ, для Π΅Π³ΠΎ выяснСния, Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉΒ ps. И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΌΡ‹ запускаСм py-spyΒ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅Β top, пСрСдавая Π΅ΠΌΡƒ PID. Π­Ρ‚ΠΎ Π²Π΅Π΄Ρ‘Ρ‚ ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠΈΡ… Π½Π° Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Linux-ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°Β top.

Π”Π°Π½Π½Ρ‹Π΅, Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΡ‹Π΅ py-spy Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ top

Π’ΡƒΡ‚, ΠΏΡ€Π°Π²Π΄Π°, Π² нашСм распоряТСнии оказываСтся Π½Π΅ Ρ‚Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ скрипт прСдставляСт собой всСго лишь ΠΎΠ΄Π½Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΡƒΡŽΡΡ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ врСмя. Но Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… случаях, вСроятнСС всСго, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΎΡ‚Ρ‡Ρ‘Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ свСдСния ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… функциях, совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… процСссорноС врСмя. А это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ нСсколько ΠΏΡ€ΠΎΡΡΠ½ΠΈΡ‚ΡŒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ с ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π‘ΠΎΠ»Π΅Π΅ Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ΅ исслСдованиС ΠΊΠΎΠ΄Π°

ΠŸΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠΈ, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π²Π°ΠΌ Π² Π΄Π΅Π»Π΅ обнаруТСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, связанныС с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ. Но Ссли это Π½Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΡŽ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… строк ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Π΄ΠΎ Π΄ΠΎΡ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, это Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° Π±ΠΎΠ»Π΅Π΅ Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… инструмСнтов прСдставлСн ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌΒ line_profiler. Он, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΡƒΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎ Π΅Π³ΠΎ названию, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для выяснСния Ρ‚ΠΎΠ³ΠΎ, сколько Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΡƒΡ…ΠΎΠ΄ΠΈΡ‚ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ строки ΠΊΠΎΠ΄Π°:

# https://github. com/pyutils/line_profiler
pip install line_profiler
kernprof -l -v some-code.pyΒ  # Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π½ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя...
Wrote profile results to some-code.py.lprof
Timer unit: 1e-06 s
Total time: 13.0418 s
File: some-code.py
Function: exp at line 3
Line #Β  Β  Β  Hits Β  Β  Β  Β  TimeΒ  Per Hit Β  % TimeΒ  Line Contents
Β Β Β Β Β 3 Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  @profile
Β Β Β Β Β 4 Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  def exp(x):
Β Β Β Β Β 5 Β  Β  Β  Β  1Β  Β  Β  Β  Β  4.0Β  Β  Β  4.0Β  Β  Β  0.0Β  Β  Β  getcontext().prec += 2
Β Β Β Β Β 6 Β  Β  Β  Β  1Β  Β  Β  Β  Β  0.0Β  Β  Β  0.0Β  Β  Β  0.0Β  Β  Β  i, lasts, s, fact, num = 0, 0, 1, 1, 1
Β Β Β Β Β 7Β  Β  Β  5818 Β  Β  Β  4017.0Β  Β  Β  0.7Β  Β  Β  0.0Β  Β  Β  while s != lasts:
Β Β Β Β Β 8Β  Β  Β  5817 Β  Β  Β  1569.0Β  Β  Β  0.3Β  Β  Β  0.0Β  Β  Β  Β  Β  lasts = s
Β Β Β Β Β 9Β  Β  Β  5817 Β  Β  Β  1837.0Β  Β  Β  0.3Β  Β  Β  0.0Β  Β  Β  Β  Β  i += 1
Β Β Β Β 10Β  Β  Β  5817 Β  Β  Β  6902.0Β  Β  Β  1.2Β  Β  Β  0.1Β  Β  Β  Β  Β  fact *= i
Β Β Β Β 11Β  Β  Β  5817 Β  Β  Β  2604.0Β  Β  Β  0.4Β  Β  Β  0.0Β  Β  Β  Β  Β  num *= x
Β Β Β Β 12Β  Β  Β  5817 Β  13024902.0 Β  2239.1 Β  Β  99.9Β  Β  Β  Β  Β  s += num / fact
Β Β Β Β 13 Β  Β  Β  Β  1Β  Β  Β  Β  Β  5.
0Β  Β  Β  5.0Β  Β  Β  0.0Β  Β  Β  getcontext().prec -= 2 Β Β Β Β 14 Β  Β  Β  Β  1Β  Β  Β  Β  Β  2.0Β  Β  Β  2.0Β  Β  Β  0.0Β  Β  Β  return +s

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Β line_profiler распространяСтся вмСстС с интСрфСйсом ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки kernprofΒ (Π½Π°Π·Π²Π°Π½Π½Ρ‹ΠΌ Ρ‚Π°ΠΊ Π² Ρ‡Π΅ΡΡ‚ΡŒ Π ΠΎΠ±Π΅Ρ€Ρ‚Π° ΠšΠ΅Ρ€Π½Π°), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ эффСктивного Π°Π½Π°Π»ΠΈΠ·Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² тСстовых ΠΏΡ€ΠΎΠ³ΠΎΠ½ΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° нашСго ΠΊΠΎΠ΄Π° этой ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ созданию 

.lprof-Ρ„Π°ΠΉΠ»Π° со свСдСниями ΠΎΠ± Π°Π½Π°Π»ΠΈΠ·Π΅ ΠΊΠΎΠ΄Π°. Π’ нашСм распоряТСнии, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, оказываСтся ΠΎΡ‚Ρ‡Ρ‘Ρ‚, Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ Π½Π° экран (ΠΏΡ€ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠΈΒ ΠΎΠΏΡ†ΠΈΠΈ -v), ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ Π²Ρ‹ΡˆΠ΅. Π’ΡƒΡ‚ Ρ‡Ρ‘Ρ‚ΠΊΠΎ Π²ΠΈΠ΄Π½Ρ‹ мСста Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡƒΡ…ΠΎΠ΄ΠΈΡ‚ большС всСго Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ сильно ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π² Π΄Π΅Π»Π΅ поиска ΠΈ исправлСния ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ. Π’ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Β @profile, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΒ exp. Π­Ρ‚ΠΎ β€” Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ позволяСт line_profilerΒ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΡƒΡŽ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² Ρ„Π°ΠΉΠ»Π΅ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ.

Но Π΄Π°ΠΆΠ΅ Ссли построчно ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, пСрвоисточник ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Π½Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ. НапримСр, Ρ‚Π°ΠΊΠΎΠ΅ Π±Ρ‹Π²Π°Π΅Ρ‚ Π² Ρ‚ΠΎΠΌ случаС, Ссли Π² конструкциях whileΒ ΠΈΠ»ΠΈΒ ifΒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ условия, составлСнныС ΠΈΠ· мноТСства Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. Π’ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… случаях ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Ρ‹Π΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹, Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ ΠΎΠ΄Π½Ρƒ строку ΠΊΠΎΠ΄Π° Π½Π° нСсколько. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π½Ρ‹Π΅ ΠΈ понятныС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π°Π½Π°Π»ΠΈΠ·Π°.

Если ΠΆΠ΅ Π²Ρ‹ β€” ΠΏΠΎ-настоящСму Π»Π΅Π½ΠΈΠ²Ρ‹ΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ (ΠΊΠ°ΠΊ я), ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ тСкстового Π²Ρ‹Π²ΠΎΠ΄Π° Π² интСрфСйсС ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки β€” это для вас ΡƒΠΆΠ΅ слишком β€” Ρ‚ΠΎΠ³Π΄Π° Π²ΠΎΡ‚ Π²Π°ΠΌ Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ инструмСнт β€”Β 

pyheat. Π­Ρ‚ΠΎ β€” ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ, основанный Π½Π°Β pprofile, Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΎΠΌ построчном ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ΅, создатСли ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ‡Π΅Ρ€ΠΏΠ°Π»ΠΈ Π²Π΄ΠΎΡ…Π½ΠΎΠ²Π΅Π½ΠΈΠ΅ ΠΈΠ· ΠΊΠΎΠ΄Π°Β line_profiler. Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚Π΅ΠΏΠ»ΠΎΠ²ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚Ρƒ для строк/областСй ΠΊΠΎΠ΄Π°, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ долю Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:

pip install py-heat
pyheat some-code. py --out image_file.png
ВСпловая ΠΊΠ°Ρ€Ρ‚Π°, построСнная с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ pyheat

Учитывая простоту ΠΊΠΎΠ΄Π° нашСго ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, ΠΎΡ‚Ρ‡Ρ‘Ρ‚, Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ Π½Π° экран с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽΒ kernprof, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ, выглядит достаточно понятным. Но Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Π°Ρ тСпловая ΠΊΠ°Ρ€Ρ‚Π° Π΅Ρ‰Ρ‘ Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ ΡƒΠ·ΠΊΠΎΠ΅ мСсто нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π”ΠΎ сих ΠΏΠΎΡ€ ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ лишь ΠΎ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΌ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ ΠΊ рСсурсам процСссора. Но Ρ‚ΠΎ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ CPU, Π½Π΅ всСгда являСтся Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ»Π½ΡƒΠ΅Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Π°Ρ ΠΏΠ°ΠΌΡΡ‚ΡŒ β€” Π΄Π΅ΡˆΡ‘Π²Ρ‹ΠΉ рСсурс, поэтому программисты ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°ΡŽΡ‚ΡΡ ΠΎ Π΅Ρ‘ использовании. По ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ β€” Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ исчСрпаСт Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ.

Π”Π°ΠΆΠ΅ Ссли ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ ΠΏΠΎΠΏΠ°Π»Π° Π² ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° Π΅ΠΉ Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ памяти, всё Ρ€Π°Π²Π½ΠΎ, Ρ‚ΠΎ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, стоит ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ. Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ это ΠΌΠΎΠΆΠ½ΠΎ для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ с ΠΏΡ€ΠΈΡ†Π΅Π»ΠΎΠΌ Π½Π° экономию памяти, ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ большС памяти Ρ€Π°Π΄ΠΈ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ Π΅Ρ‘ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Для Π°Π½Π°Π»ΠΈΠ·Π° использования памяти ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ инструмСнтом memory_profiler. Он ΠΏΠΎΡ…ΠΎΠΆ Π½Π° ΡƒΠΆΠ΅ извСстный Π²Π°ΠΌΒ line_profiler:

# https://github.com/pythonprofilers/memory_profiler
pip install memory_profiler psutil
psutil is needed for better memory_profiler performance
python -m memory_profiler some-code.py
Filename: some-code.py
Line #Β  Β  Mem usageΒ  Β  IncrementΒ  Occurrences Β  Line Contents
Β Β Β Β 15 Β  39.113 MiB Β  39.113 MiBΒ  Β  Β  Β  Β  Β  1 Β  @profile
Β Β Β Β 16Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  def memory_intensive():
Β Β Β Β 17 Β  46.539 MiBΒ  Β  7.426 MiBΒ  Β  Β  Β  Β  Β  1 Β  Β  Β  small_list = [None] * 1000000
Β Β Β Β 18Β  122.852 MiB Β  76.312 MiBΒ  Β  Β  Β  Β  Β  1 Β  Β  Β  big_list = [None] * 10000000
Β Β Β Β 19 Β  46.766 MiBΒ  -76.086 MiBΒ  Β  Β  Β  Β  Β  1 Β  Β  Β  del big_list
Β Β Β Β 20 Β  46.766 MiBΒ  Β  0.000 MiBΒ  Β  Β  Β  Β  Β  1 Β  Β  Β  return small_list

Π­Ρ‚ΠΎ испытаниС ΠΌΡ‹ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠΌ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΊΠΎΠ΄Π°.

Ѐункция memory_intensive создаёт ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Π΅Ρ‚ большиС Python-списки. На Π΅Ρ‘ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ способны ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ Ρ‚Ρƒ ΠΏΠΎΠ»ΡŒΠ·Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ΅Ρ‚ принСсти Π½Π°ΠΌΒ memory_profilerΒ Π² Π΄Π΅Π»Π΅ Π°Π½Π°Π»ΠΈΠ·Π° использования памяти. Π’Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ ΠΏΡ€ΠΈΒ kernprof-ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π½Π°Π΄ΠΎ ΠΎΡΠ½Π°ΡΡ‚ΠΈΡ‚ΡŒ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠΌΒ @profile. Он ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚Β memory_profilerΒ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΊΠΎΠ΄ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

Π’ΡƒΡ‚ Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ для ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ списка, содСрТащСго значСния None, Π±Ρ‹Π»ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ Π±ΠΎΠ»Π΅Π΅ 100 ΠœΠΈΠ‘ памяти. Анализируя эти Π΄Π°Π½Π½Ρ‹Π΅, ΠΏΡ€Π°Π²Π΄Π°, Π½Π°Π΄ΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‚ Π½Π΅ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ΅ использованиС памяти, Π° Ρ‚ΠΎ, сколько памяти Π±Ρ‹Π»ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· строк Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС это Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, хранящиС списки, Π½Π° самом Π΄Π΅Π»Π΅, Π½Π΅ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ памяти. Π—Π΄Π΅ΡΡŒ ΠΎΡ‚Ρ€Π°ΠΆΡ‘Π½ лишь Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ Python-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹Β list, вСроятнСС всСго, Π²Ρ‹Π΄Π΅Π»ΡΡŽΡ‚ ΠΏΠ°ΠΌΡΡ‚ΡŒ с запасом, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒΡΡ ΠΏΠΎΠ΄ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ рост ΠΎΠ±ΡŠΡ‘ΠΌΠ° Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΏΠ°ΡΡ‚ΡŒ Π² список.

Как ΠΌΡ‹ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ, Python-списки часто ΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡŽΡ‚ сотни ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚ ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π³ΠΈΠ³Π°Π±Π°ΠΉΡ‚Ρ‹ памяти. Быстро ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡ€ΠΈΠ±Π΅Π³Π½ΡƒΠ² ΠΊ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, которая Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ Π½Π° ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹Β array. Они эффСктивнСС хранят Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ², Π²Ρ€ΠΎΠ΄Π΅Β intΒ ΠΈΠ»ΠΈΒ float. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ использованиС памяти, выбирая Ρ‚ΠΈΠΏΡ‹ с мСньшСй Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ, примСняя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Β typecode. Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ help(array) Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ пСрСчислСны доступныС Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Ρ‚ΠΈΠΏΠΎΠ² ΠΈ ΠΈΡ… трСбования ΠΊ памяти.

Если ΠΆΠ΅ Π΄Π°ΠΆΠ΅ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ инструмСнты, Π΄Π°ΡŽΡ‰ΠΈΠ΅ Ρ‚ΠΎΡ‡Π½ΡƒΡŽ ΠΈ Π΄Π΅Ρ‚Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π½Π°ΠΉΡ‚ΠΈ ΡƒΠ·ΠΊΠΈΠ΅ мСста ΠΊΠΎΠ΄Π°, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π΄ΠΈΠ·Π°ΡΡΠ΅ΠΌΠ±Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ ΠΈ Π²Ρ‹ΠΉΡ‚ΠΈ Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ Python. А Ссли ΠΈ дизассСмблированиС Π½Π΅ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΈΠΌΠ΅ΡŽΡ‰ΡƒΡŽΡΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ β€” Ρ‚ΠΎΠ³Π΄Π° ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ выяснСниС ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π² Π½Π΅Π΄Ρ€Π°Ρ… Python ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Π½Π΅ΠΊΠΎΠ΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ΠΎΠΎΡ€ΡƒΠΆΠΈΠ²ΡˆΠΈΡΡŒ знаниями, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ Π² Ρ…ΠΎΠ΄Π΅ Ρ‚Π°ΠΊΠΈΡ… исслСдований, Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ Π²Ρ‹ смоТСтС ΠΏΠΈΡΠ°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄.

ДизассСмблированный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, воспользовавшись встроСнным ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌΒ dis, ΠΏΠ΅Ρ€Π΅Π΄Π°Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄ΡƒΒ dis. dis(...). Он сгСнСрируСт ΠΈ Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ список инструкций Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°, выполняСмого ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

from math import e
def exp(x):
Β Β Β Β return e**xΒ  # math.exp(x)
import dis
dis.dis(exp)

Π’ этом ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π΅ ΠΌΡ‹ всё врСмя исслСдовали ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ возвСдСния eΒ Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒΒ X. Π’Ρ‹ΡˆΠ΅ ΠΆΠ΅ прСдставлСна ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ°Ρ функция, которая Ρ€Π΅ΡˆΠ°Π΅Ρ‚ эту Π·Π°Π΄Π°Ρ‡Ρƒ с высокой ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ дизассСмблирования быстрой ΠΈ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΈΡ… дизассСмблирования окаТутся ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ. Π˜Ρ… ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Ρ‰Ρ‘ Π±ΠΎΠ»Π΅Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ΄Π½Π° функция Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ Π΄Ρ€ΡƒΠ³ΠΎΠΉ.

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ выглядит быстрая функция:

2           0 LOAD_GLOBAL              0 (e)
            2 LOAD_FAST                0 (x)
            4 BINARY_POWER
            6 RETURN_VALUE

А Π²ΠΎΡ‚ β€” наша старая функция, которая Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ:

4           0 LOAD_GLOBAL              0 (getcontext)
              2 CALL_FUNCTION            0
              4 DUP_TOP
              6 LOAD_ATTR                1 (prec)
              8 LOAD_CONST               1 (2)
             10 INPLACE_ADD
             12 ROT_TWO
             14 STORE_ATTR               1 (prec)
  5          16 LOAD_CONST               2 ((0, 0, 1, 1, 1))
             18 UNPACK_SEQUENCE          5
             20 STORE_FAST               1 (i)
             22 STORE_FAST               2 (lasts)
             24 STORE_FAST               3 (s)
             26 STORE_FAST               4 (fact)
             28 STORE_FAST               5 (num)
  6     >>   30 LOAD_FAST                3 (s)
             32 LOAD_FAST                2 (lasts)
             34 COMPARE_OP               3 (!=)
             36 POP_JUMP_IF_FALSE       80
. ..
             100 RETURN_VALUE

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΡƒΡ‚ происходит β€” Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ Π²Π·Π³Π»ΡΠ½ΡƒΡ‚ΡŒ на этот отвСт со StackOverflow, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ раскрываСтся смысл столбцов, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ распрСдСлСны эти Π΄Π°Π½Π½Ρ‹Π΅.

ΠŸΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ ΠΊ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ

Π’ΠΎΡ‚, ΠΊΡ‚ΠΎ занимаСтся ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ€Π°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ Π΄ΠΎΠ²Π΅Π΄Ρ‘Ρ‚ Π΅Ρ‘ Π΄ΠΎ Ρ‚Π°ΠΊΠΎΠ³ΠΎ состояния, ΠΊΠΎΠ³Π΄Π° измСнСния Π² ΠΊΠΎΠ΄Π΅ ΠΈΠ»ΠΈ Π² Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°Ρ… Π½Π°Ρ‡Π½ΡƒΡ‚ Π΄Π°Π²Π°Ρ‚ΡŒ совсСм нСбольшиС ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ. Π’ этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° внСшниС инструмСнты, способныС Π΄Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ прирост ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

Π’Π΅Ρ€Π½Ρ‹ΠΉ способ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠΎΠ΄Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² компиляции Π΅Π³ΠΎ Π² Π²ΠΈΠ΄Π΅ C-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, воспользовавшись Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ инструмСнтами. НапримСр β€” PyPy ΠΈΠ»ΠΈ Cython. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… β€” это JIT-компилятор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π½Π΅ΠΏΠΎΡΡ€Π΅Π΄ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Π·Π°ΠΌΠ΅Π½Ρƒ CPython. Он ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π°Ρ‚ΡŒ, Π½Π΅ трСбуя Π½ΠΈΠΊΠ°ΠΊΠΈΡ… усилий ΠΎΡ‚ программиста, Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ рост ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊΠΎΠ΄Π°. Π•Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ достойным Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π½Π΅ΠΊΠΎΠ΅ΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ PyPy β€” достаточно Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π°Ρ€Ρ…ΠΈΠ², Ρ€Π°ΡΠΏΠ°ΠΊΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ PyPy свой ΠΊΠΎΠ΄:

# Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π°Ρ€Ρ…ΠΈΠ² ΠΌΠΎΠΆΠ½ΠΎ с https://www.pypy.org/download.html
tar -xjf pypy3.8-v7.3.7-linux64.tar.bz2
cd pypy3.8-v7.3.7-linux64/bin
./pypy some-code.py

ΠŸΡ€ΠΎΡΡ‚ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ благодаря PyPy ΠΌΠΎΠΆΠ½ΠΎ, Π½Π΅ прилагая особых усилий, сразу ΠΆΠ΅ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, устроим нСбольшоС испытаниС скрипта, Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ CPython ΠΈ PyPy:

time python some-code.py
real 0m2,861s
user 0m2,841s
sys Β  Β  0m0,016s
time pypy some-code.py
real 0m1,450s
user 0m1,422s
sys Β  Β  0m0,009s

PyPy, ΠΏΠΎΠΌΠΈΠΌΠΎ Π²Ρ‹ΡˆΠ΅ΠΎΠ·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… плюсов, отличаСтся Π΅Ρ‰Ρ‘ ΠΈ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ для Π΅Π³ΠΎ использования Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π²Π½ΠΎΡΠΈΡ‚ΡŒ Π² ΠΊΠΎΠ΄ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. Он, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ всС встроСнныС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Python.

Всё это Π·Π²ΡƒΡ‡ΠΈΡ‚ просто Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½ΠΎ использованиС PyPy ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΈΠ΄Ρ‚ΠΈ Π½Π° ΠΊΠΎΠ΅-ΠΊΠ°ΠΊΠΈΠ΅ компромиссы. Π­Ρ‚ΠΎΡ‚ инструмСнт ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹, Π½ΡƒΠΆΠ΄Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π² C-привязках, Ρ‚Π°ΠΊΠΈΠ΅, ΠΊΠ°ΠΊΒ numpy, Π½ΠΎ это создаёт Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ Π½Π° систСму, Ρ‡Ρ‚ΠΎ сильно замСдляСт ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, сводя Π½Π° Π½Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. PyPy, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π½Π΅ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ Π² ситуациях, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ внСшниС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΈΠ»ΠΈ Π² случаях, ΠΊΠΎΠ³Π΄Π° Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Ρ‘Ρ‚ ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. И, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ, Ссли Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Ρ‘Ρ‚ ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… привязана ΠΊ подсистСмС Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°, Π½Π΅ стоит ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π²Ρ‹Π³ΠΎΠ΄Ρ‹ ΠΎΡ‚ примСнСния PyPy.

Если PyPy Π²Π°ΠΌ Π½Π΅ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ β€” ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Cythoh. Π­Ρ‚ΠΎ β€” компилятор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ C-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠΎΠ² (Π½Π΅ подсказки ΠΏΠΎ Ρ‚ΠΈΠΏΠ°ΠΌ, примСняСмыС Π² Python) для создания ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Python. Cython, ΠΊΡ€ΠΎΠΌΠ΅ ΠΏΡ€ΠΎΡ‡Π΅Π³ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ AOT-ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ прирост ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ благодаря ΡƒΡ…ΠΎΠ΄Ρƒ ΠΎΡ‚ Ρ…ΠΎΠ»ΠΎΠ΄Π½ΠΎΠ³ΠΎ запуска ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Но использованиС Cython Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π° с использованиСм особого синтаксиса, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΡƒΡΠ»ΠΎΠΆΠ½Π΅Π½ΠΈΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

Если Π²Ρ‹ Π½Π΅ ΠΏΡ€ΠΎΡ‚ΠΈΠ² ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° Python-синтаксис, Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ, Ρ‚ΠΎΠ³Π΄Π° Π²Π°ΠΌ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, интСрСсно Π±ΡƒΠ΄Π΅Ρ‚ Π²Π·Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π½Π°Β prometeoΒ β€” встраиваСмый язык, ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‰ΠΈΠΉ спСцифику ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π½ΠΎΠΉ области, основанный Π½Π° Python. Он, Π² частности, ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ Π½Π° Π½Π°ΡƒΡ‡Π½Ρ‹Π΅ вычислСния. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, написанныС Π½Π°Β prometeo, Ρ‚Ρ€Π°Π½ΡΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² чистый C-ΠΊΠΎΠ΄. Π˜Ρ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ сравнима со ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ написанных Π½Π° C.

Если ΠΆΠ΅ Π½ΠΈ ΠΎΠ΄Π½ΠΎ ΠΈΠ· прСдставлСнных Ρ‚ΡƒΡ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π²Π°ΠΌ Π²Ρ‹ΠΉΡ‚ΠΈ Π½Π° Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Ρ‚ΠΎΠ³Π΄Π° Π²Π°ΠΌ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, стоит ΠΏΠΈΡΠ°Ρ‚ΡŒ свой ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½Π° C ΠΈΠ»ΠΈ Fortran, Π° для Π²Ρ‹Π·ΠΎΠ²Π° этого ΠΊΠΎΠ΄Π° ΠΈΠ· Python ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ EFI. Π‘Ρ€Π΅Π΄ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ способны Π²Π°ΠΌ Π² этом ΠΏΠΎΠΌΠΎΡ‡ΡŒ, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒΒ ctypesΒ ΠΈΒ cffi для языка C, ΠΈΒ f2py для Fortran.

Π˜Ρ‚ΠΎΠ³ΠΈ

ΠŸΠ΅Ρ€Π²ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Если ΠΆΠ΅ Π²Π°ΠΌ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ это Π½ΡƒΠΆΠ½ΠΎ β€” ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ инструмСнты для профилирования ΠΊΠΎΠ΄Π°, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ β€” это ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π²Π°ΠΌ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ пустой Ρ‚Ρ€Π°Ρ‚Ρ‹ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Π»ΠΎΠ·Π½Π°Ρ‡ΠΈΠΌΡ‹Ρ… Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Π•Ρ‰Ρ‘, занимаясь ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ, ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ воспроизводимыС тСсты ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ для ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅ΠΌΠΎΠ³ΠΎ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠ΄Π°. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ΅ воздСйствиС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ Π½Π°Ρ†Π΅Π»Π΅Π½Π° Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΌΠΎΡ‡ΡŒ всСм ΠΆΠ΅Π»Π°ΡŽΡ‰ΠΈΠΌ Π² поискС источников ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ. Но Π²ΠΎΡ‚ исправлСниС Ρ‚Π°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ β€” это ΡƒΠΆΠ΅ совсСм другая история. КоС-ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠ΄Π΅ΠΈ Π½Π° эту Ρ‚Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π²Β ΠΎΠ΄Π½ΠΎΠΉΒ ΠΈΠ· ΠΌΠΎΠΈΡ… ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… статСй, посвящённой ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ускорСния Python-ΠΊΠΎΠ΄Π°.

О, Π° ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚Π΅ ΠΊ Π½Π°ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ? 😏

ΠœΡ‹ Π²Β wunderfund.io занимаСмся высокочастотной алготорговлСй с 2014 Π³ΠΎΠ΄Π°. Высокочастотная торговля β€” это Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠ΅ сорСвнованиС Π»ΡƒΡ‡ΡˆΠΈΡ… программистов ΠΈ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠΎΠ² всСго ΠΌΠΈΡ€Π°. ΠŸΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΠ²ΡˆΠΈΡΡŒ ΠΊ Π½Π°ΠΌ, Π²Ρ‹ станСтС Ρ‡Π°ΡΡ‚ΡŒΡŽ этой ΡƒΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ схватки.

ΠœΡ‹ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌ интСрСсныС ΠΈ слоТныС Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΠΎ Π°Π½Π°Π»ΠΈΠ·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ low latency Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ для ΡƒΠ²Π»Π΅Ρ‡Π΅Π½Π½Ρ‹Ρ… исслСдоватСлСй ΠΈ программистов. Π“ΠΈΠ±ΠΊΠΈΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊ ΠΈ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π±ΡŽΡ€ΠΎΠΊΡ€Π°Ρ‚ΠΈΠΈ, Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ быстро ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ ΠΈ Π²ΠΎΠΏΠ»ΠΎΡ‰Π°ΡŽΡ‚ΡΡ Π² Тизнь.

БСйчас ΠΌΡ‹ ΠΈΡ‰Π΅ΠΌ плюсовиков, питонистов, Π΄Π°Ρ‚Π°-ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ΠΎΠ² ΠΈ ΠΌΠ»-рисСрчСров.

ΠŸΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΡΠΉΡ‚Π΅ΡΡŒ ΠΊ нашСй ΠΊΠΎΠΌΠ°Π½Π΄Π΅.

Как ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ прилоТСния Π½Π° Python

На Python ΠΏΠΈΡˆΡƒΡ‚ ΠΊΠ°ΠΊ дСсктопныС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‚Π°ΠΊ ΠΈ Π²Ρ‹ΡΠΎΠΊΠΎΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ web-прилоТСния. Он являСтся ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌ языком ΠΈ благодаря этому ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹Π΅ инструмСнты. НапримСр, ΠΈΠ½Ρ‚Ρ€ΠΎΡΠΏΠ΅ΠΊΡ†ΠΈΡŽ ΠΈ ΠΌΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅.

Но Python Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅Ρ‚ ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ограничСния, ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π½ΠΈΡ… β€” сниТСниС скорости Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ, написанными Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… языках программирования (C++ ΠΈ Π΄Ρ€).

АндрСй Π‘ΠΌΠΈΡ€Π½ΠΎΠ²

Python-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ, ΠΏΡ€Π΅ΠΏΠΎΠ΄Π°Π²Π°Ρ‚Π΅Π»ΡŒ ΠΏΠΎ финансовой грамотности Π² Московской школС программистов (МШП)

Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ я Ρ€Π°Π·Π±Π΅Ρ€Ρƒ интСрСсный кСйс, Ρ‡Ρ‚ΠΎΠ±Ρ‹Β  ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉΡΡ ΠΊΠΎΠ΄ Π½Π° Python.

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ (Π΄Π΅ΠΌΠΎ-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅)

Π‘Ρ€Π°Π·Ρƒ ΠΆΠ΅ скаТу, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒΡΡ Π² ΠΏΡƒΡ‡ΠΈΠ½Ρƒ Ρ…Π°Ρ€Π΄ΠΊΠΎΡ€Π½ΠΎΠΉ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΈ ΠΏΡ€ΠΎΠ΄ΠΈΡ€Π°Ρ‚ΡŒΡΡ сквозь дСсяток ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² стСкС ΠΈ слоТныС алгоритмичСскиС конструкции. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° проста: всС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я ΠΏΠΎΠΊΠ°ΠΆΡƒ сСгодня, прСкрасно воспроизводятся Π½Π° простом ΠΊΠΎΠ΄Π΅ ΠΈ послС этого Ρ‚ΠΈΡ€Π°ΠΆΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π½Π° Π»ΡŽΠ±Ρ‹Π΅ ΠΌΠ°ΡΡˆΡ‚Π°Π±Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹.

А Π² качСствС стартового ΠΊΠΎΠ΄Π° ΠΌΡ‹ Π²ΠΎΠ·ΡŒΠΌΡ‘ΠΌ Π·Π°Π΄Π°Ρ‡Ρƒ: имССтся ΠΌΠ°Π³Π°Π·ΠΈΠ½, ΠΏΡ€ΠΎΠ΄Π°ΡŽΡ‰ΠΈΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Ρ‚ΠΎΠ²Π°Ρ€Ρ‹. Π’ΠΎΠ²Π°Ρ€ характСризуСтся трСмя Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π°ΠΌΠΈ: Π½Π°Π·Π²Π°Π½ΠΈΠ΅, Ρ†Π΅Π½Π°, Π²Π°Π»ΡŽΡ‚Π°. НСобходимо Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Ρ‚ΠΎΠ²Π°Ρ€ΠΎΠ², Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π½Π΅ΠΊΠΈΠΌΠΈ Ρ‚ΠΎΠ²Π°Ρ€Π°ΠΌΠΈ.

На языкС Python такая Π·Π°Π΄Π°Ρ‡Π° Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ быстро:

Π‘Ρ€Π°Π·Ρƒ ΠΎΡ‚ΠΌΠ΅Ρ‡Ρƒ, Ρ‡Ρ‚ΠΎ я взял достаточно большой Ρ€Π°Π·ΠΌΠ΅Ρ€ списка с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»Π°ΡΡŒ Ρ‚Π°ΠΊΠΎΠ΅ количСство Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π½Π΅ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π΄Π΅Π»ΡŒΡ‚Ρƒ Π² тысячных долях сСкунды.

ΠŸΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Казалось Π±Ρ‹, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄, Π½ΠΎ ΠΊΠ°ΠΊ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒ? Для этого Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ с прилоТСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅, насколько Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΎΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

ΠŸΡ€ΠΎΡ†Π΅ΡΡ сбора этих ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ называСтся ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ прилоТСния. ΠŸΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ процСсс профилирования ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠ°ΠΊ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹, Ρ‚Π°ΠΊ ΠΈ ΠΏΠΎ памяти.

ΠŸΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ

Π‘Π½Π°Ρ‡Π°Π»Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² Π½Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ скорости Π΅Ρ‘ Ρ€Π°Π±ΠΎΡ‚Ρ‹. Для этого Π² Python Π΅ΡΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ функция time, находящаяся Π² ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅. ИдСя использования этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΡ‡Π΅Π½ΡŒ проста: ΠΌΡ‹ измСняСм Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ врСмя Π² Π½Π°Ρ‡Π°Π»Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Π² ΠΊΠΎΠ½Ρ†Π΅. Π”Π°Π»Π΅Π΅ считаСм Π΄Π΅Π»ΡŒΡ‚Ρƒ, которая Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ²Π»ΡΡ‚ΡŒΡΡ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

И Π΅Ρ‰Ρ‘ нСсколько ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΡ€ΠΎ этот ΠΊΠΎΠ΄:

  1. Π’ Ρ…ΠΎΠ΄Π΅ профилирования Π½Π΅Ρ‚ смысла ΠΈΠ·ΠΌΠ΅Ρ€ΡΡ‚ΡŒ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠΎΠ΄Π°, отвСтствСнного Π·Π° Π²Π²ΠΎΠ΄ Π΄Π°Π½Π½Ρ‹Ρ… с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹, Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ· Ρ„Π°ΠΉΠ»Π°, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· сСтСвого Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° ΠΈ Ρ‚.Π΄. Π­Ρ‚ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π°ΠΏΡ€ΠΈΠΎΡ€ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΌΠΈ ΠΈΠ·-Π·Π° Π½ΠΈΠ·ΠΊΠΎΠΉ скорости ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠΉ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ Π² ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠžΠ—Π£ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°. Если Π²Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π½ΠΈΠ·ΠΊΠΎΠΉ скорости кроСтся Π² ΠΊΠΎΠ΄Π΅ Π²Π²ΠΎΠ΄Π° Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚ΠΎΠ³Π΄Π° Π΅Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ основной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.
  2. Одна ΠΈ Ρ‚Π° ΠΆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, запущСнная Π΄Π²Π° Ρ€Π°Π·Π°, практичСски Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ выдаст ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎΠ΅ врСмя выполнСния. Π­Ρ‚ΠΎ происходит ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° выполняСтся Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ постоянно Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ„ΠΎΠ½ΠΎΠ²Ρ‹Π΅ процСссы. И Ρ‡Π°Ρ‰Π΅ всСго ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ всС лишниС процСссы Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… влияниС, достаточно всСго лишь Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ ΠΈ ΠΏΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ срСднСС врСмя выполнСния (Ρ‡Ρ‚ΠΎ ΠΈ сдСлано Π² ΠΊΠΎΠ΄Π΅).

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ ΠΏΡ€ΠΈ запускС ΠΏΠΎΠΊΠ°Π·Π°Π» ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Π°ΠΉΠΌΠΈΠ½Π³ΠΈ:

Π‘Ρ€Π°Π·Ρƒ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π΄ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Π΄ΠΎ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹ сСкунды. Запускал ΠΊΠΎΠ΄ я Π½Π° систСмС со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ:

  • Intel Core i7-7700HQ
  • 16Gb RAM
  • KUbuntu 22.04

Π•Ρ‰Ρ‘ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ сразу ΠΆΠ΅ пСрвая оптимизация

Если Ρƒ вас β€œΡ‚ΠΎΡ€ΠΌΠΎΠ·ΠΈΡ‚β€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ сотни ΠΈ тысячи строк ΠΊΠΎΠ΄Π° ΠΈ сама Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° этого ΠΊΠΎΠ΄Π° состоит ΠΈΡ… мноТСства Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ классов, Ρ‚ΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°ΠΌΠ΅Ρ€ Ρ‚Π°ΠΉΠΌΠΈΠ½Π³ΠΎΠ² Π² Ρ‚ΠΎΠΌ Π²ΠΈΠ΄Π΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ я написал Π²Ρ‹ΡˆΠ΅, Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΡ€Π°ΠΉΠ½Π΅ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ.

Но эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ€Π΅ΡˆΠ°Π΅ΠΌΠ° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ встроСнного Π² Python срСдства профилирования, идСально подходящСго для Ρ‚Π°ΠΊΠΎΠΉ ситуации β€” ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ cProfile. Она способна Π½Π΅ просто Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ ΠΈ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ врСмя Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹, Π½ΠΎ ΠΈ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π΄Π°ΠΆΠ΅ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ создания списков, выдСлСния памяти, добавлСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ Ρ‚. Π΄.).

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ cProfile, Π½Π΅ трСбуСтся ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΊΠΎΠ΄. Достаточно просто Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° исполнСниС с ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ модуля:

python3 -m cProfile main.py

Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС вся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° выполнится ΠΈ послС Π½Π΅Ρ‘ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½Π° Π΄Π΅Ρ‚Π°Π»ΡŒΠ½Π°Ρ информация ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

Π‘Ρ€Π°Π·Ρƒ ΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ мысли:

  1. НаличиС любого Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ° замСдляСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Π­Ρ‚ΠΎ происходит, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ любой ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ добавляСт свой исполняСмый ΠΊΠΎΠ΄, благодаря ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΈ собираСтся статистика выполнСния. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ этого срСднСС врСмя выполнСния нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ»ΠΎΡΡŒ с 2.46 Π΄ΠΎ 3.26 сСкунд.
  2. Π‘Ρ€Π°Π·Ρƒ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ большС всСго Ρ€Π°Π· вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ list.append, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ добавляСт Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² список. И ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° этом мСстС появляСтся идСя для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ: Ссли ΠΌΡ‹ Π·Π°Ρ€Π°Π½Π΅Π΅ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Ρ€ΠΈ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π°, Ρ‡Ρ‚ΠΎ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ Π½Π°ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π·Π°Ρ€Π°Π½Π΅Π΅ список Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°?

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ список создавался сразу:

Запустим Π΅Π³ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ с использованиСм cProfile. И Ρ‡Ρ‚ΠΎ ΠΆΠ΅ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ?

Π‘Ρ€Π΅Π΄Π½Π΅Π΅ врСмя ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠ»ΠΎΡΡŒ Π΄ΠΎ 2.06 сСкунд, ΠΈ это со Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠΎΠΌ. А Π±Π΅Π· Π½Π΅Π³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊ Π²ΠΎΠΎΠ±Ρ‰Π΅ 1.66! И всё ΠΏΡƒΡ‚Ρ‘ΠΌ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΉ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ.

ΠŸΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ памяти

Π’Π°ΠΊΠΆΠ΅ сразу ΠΆΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² наш ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ памяти, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΡ‡Π΅Π½ΡŒ интСрСсно ΡƒΠ·Π½Π°Ρ‚ΡŒ β€œΡΠΊΠΎΠ»ΡŒΠΊΠΎ ΠΆΠ΅ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π² памяти Ρ‚Ρ€ΠΈ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° товаров”. Для подсчёта памяти Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ pympler.

И Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ ΠΏΡ€ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° Π² Ρ‚Ρ€ΠΈ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° Ρ‚ΠΎΠ²Π°Ρ€ΠΎΠ² ΠΏΠΎΠΊΠ°Π·Π°Π» ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹:

Π Π°Π·ΠΌΠ΅Ρ€ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°: 176000864 Π±Π°ΠΉΡ‚ ΠΈΠ»ΠΈ 167.85 ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ я ΡƒΠ±Ρ€Π°Π» ΠΈΠ· ΠΊΠΎΠ΄Π° подсчёт ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° проста: pympler для подсчёта количСства Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠΉ памяти ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎ всСм ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌΡΡ структурам Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈ Π²ΠΎ врСмя подсчёта ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ выполнСния увСличиваСтся Ρ€Π°Π· Π² ΠΏΡΡ‚ΡŒ, дСлая ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π΅ΠΎΠΏΡ€Π°Π²Π΄Π°Π½Π½Ρ‹ΠΌ.

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ достаточно Π·Π½Π°Π΅ΠΌ ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΈ нашСго прилоТСния (ΠΈ Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΈ Π² памяти) β€” приступим ΠΊ Π΅Π³ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ.

Бпособы ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ структур Π΄Π°Π½Π½Ρ‹Ρ…

Начнём ΠΌΡ‹ с нСсколько нСстандартной ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ β€” Π·Π°Π»Π΅Π·Π΅ΠΌ Π²Π½ΡƒΡ‚Ρ€ΡŒ нашСго ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚ΠΎΠ²Π°Ρ€Π° ΠΈ ΠΎΡΠ½ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚Π°ΠΌ покопаСмся.

БСйчас ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ прСдставлСн Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±Ρ‹ΠΊΠ½ΠΎΠ²Π΅Π½Π½ΠΎΠ³ΠΎ класса. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ΄ΡƒΠΌΠ°Π΅ΠΌ, Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ здСсь ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΡƒΡŽ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΈΠ½ΡƒΡŽ структуру Π΄Π°Π½Π½Ρ‹Ρ…, которая построСна Π½Π° основС класса, Π½ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»? И такая структура Π΅ΡΡ‚ΡŒ, ΠΎΠ½Π° называСтся датакласс. ΠŸΡ€Π°Π²Π΄Π°, сразу стоит ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ датакласс являСтся нСбольшой надстройкой Π½Π°Π΄ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ классом, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ языка Ρ‡Ρ‘Ρ‚ΠΊΠΎ ΡƒΠΊΠ°Π·Π°Π»ΠΈ, ΠΊΠ°ΠΊΠΈΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ поля ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…. А Π½Π°ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ интСрСсСн датакласс с фиксированными полями, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ поля.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ это Π²Π°ΠΆΠ½ΠΎ? Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΈ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ поля Π² Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ΅, Π² классах ΠΏΠΈΡ‚ΠΎΠ½Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° структура словаря __dict__. А это, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ всСгда являСтся Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΠΎΠΌ.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Ссли ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Ρ‘Ρ‚ΠΊΡƒΡŽ структуру Π΄Π°Π½Π½Ρ‹Ρ… (Π° Ρ‡Π°Ρ‰Π΅ всСго для хранСния Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΎΠ±ΡŠΡ‘ΠΌΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ Ρ€Π°Π· Тёстко ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ структуры), Ρ‚ΠΎ послС этого ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» динамичСского добавлСния ΠΏΠΎΠ»Π΅ΠΉ, ΠΈ Π² Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ быстрСС.

Π Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ эту идСю (для этого ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ __slots__).

Если этот ΠΊΠΎΠ΄ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ врСмя выполнСния, Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ускорСниС Π² срСднСм Π½Π° 25 ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ΠΎΠ²

А Ссли Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ __slots__ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π² ΠΊΠΎΠ΄Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ ΠΏΠΎ памяти, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ получатся Π΅Ρ‰Ρ‘ Π±ΠΎΠ»Π΅Π΅ ΡΠ½ΠΎΠ³ΡΡˆΠΈΠ±Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ:

Π Π°Π·ΠΌΠ΅Ρ€ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°: 80000504 Π±Π°ΠΉΡ‚ ΠΈΠ»ΠΈ 76.29 ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚

Π’ΠΎ Π΅ΡΡ‚ΡŒ, ΠΏΡƒΡ‚Ρ‘ΠΌ ΠΎΡ‚ΠΊΠ°Π·Π° ΠΎΡ‚ динамичСского добавлСния элСмСнтов ΠΌΡ‹ сразу ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠ»ΠΈ расходы памяти нашСго прилоТСния Π²Π΄Π²ΠΎΠ΅!

И Π½Π° этом ΠΌΡ‹ Π½Π΅ остановимся.

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ оптимизация, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π½Π°ΠΌ Π² достиТСнии нашСй Ρ†Π΅Π»ΠΈ β€” Π·Π°ΠΌΠ΅Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Python Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ PyPy.

Богласно ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ ΠΈΠ· Π’ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠΈ, PyPy β€” это ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ языка Python, написанный Π½Π° языкС Python. Однако Π² Π½Π΅Π³ΠΎ встроСн Ρ‚Ρ€Π°ΡΡΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ JIT-компилятор, способный ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π½Π° Python Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ прямо Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π­Ρ‚Π° ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ позволяСт Π΅ΠΌΡƒ сущСствСнно ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ процСсс исполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ… Π»ΠΈΠ±ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΊΠΎΠ΄Π°.

Установим pypy ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

sudo apt install pypy3

А послС этого запустим ΠΊΠΎΠ΄ с Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ:

pypy3 main.py

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ говорят сами Π·Π° сСбя: скомпилированный ΠΊΠΎΠ΄ Π°ΠΏΡ€ΠΈΠΎΡ€ΠΈ выполняСтся Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ быстрСС, Π½Π΅ΠΆΠ΅Π»ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠΎΠ΄.Β 

ВрСмя исполнСния ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠ»ΠΎΡΡŒ Π΅Ρ‰Ρ‘ Π½Π° 68%. И для Ρ‚Π°ΠΊΠΎΠ³ΠΎ запуска Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ ΠΌΠ΅Π½ΡΡ‚ΡŒ исходный ΠΊΠΎΠ΄.

БправСдливости Ρ€Π°Π΄ΠΈ Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π·Π° счёт Π³Π»ΡƒΠ±ΠΈΠ½Π½ΠΎΠΉ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сторонниС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Π½Π΅ смогут Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒΡΡ Π² pypy. И для Π½ΠΈΡ… придётся ΠΈΡΠΊΠ°Ρ‚ΡŒ Π°Π½Π°Π»ΠΎΠ³ΠΈ. Но самыС популярныС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ (Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ twisted, django, numpy, scikit-learn ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅) ΠΈΠΌ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΈ работоспособны.

А ΠΊΠ°ΠΊ Π΅Ρ‰Ρ‘ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ?

Π’ ΠΌΠΈΡ€Π΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ способы ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, Π½ΠΎ ΠΎΠ½ΠΈ ΡƒΠΆΠ΅ относятся ΠΊ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ Ρ€Π°Π΄ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ…, ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°ΡŽΡ‰ΠΈΡ… ΠΊΠ°Ρ€Π΄ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ структуры ΠΊΠΎΠ΄Π° ΠΈ (ΠΈΠ»ΠΈ) Π΄Π°ΠΆΠ΅ языка программирования. Π‘Ρ€Π΅Π΄ΠΈ Π½ΠΈΡ…:

  • ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ структуры Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… со списка ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π° pandas. DataFrame.
  • Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ строгой Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ адаптация ΠΊΠΎΠ΄Π° ΠΏΠΎΠ΄ компилятор cython
  • распараллСливаниС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Nvidia CUDA.
  • И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Ссли Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ ΠΎΡ‚ ΠΏΠΎΡ‚Π΅Ρ€ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ сущСствСнно ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°ΡŽΡ‚ Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ ΠΎΡ‚ ΠΊΠ°Ρ€Π΄ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠΎΠ΄Π°, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½Ρ‹Π΅ части ΠΊΠΎΠ΄Π° Π½Π° языкС C++ ΠΈ ΠΎΡ„ΠΎΡ€ΠΌΠΈΡ‚ΡŒ ΠΈΡ… Π² Π²ΠΈΠ΄Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΈΠ· Python-ΠΊΠΎΠ΄Π°.

Π˜Ρ‚ΠΎΠ³ΠΈ

Π˜Ρ‚Π°ΠΊ, Π² Ρ…ΠΎΠ΄Π΅ нашСго ΡƒΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΠΈΡ ΠΌΡ‹

  • написали ΠΊΠΎΠ΄
  • ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΠ»ΠΈ Π΅Π³ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ (ΠΏΠΎ памяти ΠΈ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ)
  • ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Π΅Π³ΠΎ нСсколько Ρ€Π°Π·
  • Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π² Π²ΠΈΠ΄Π΅ Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π½ΠΈΠΆΠ΅.

Β 

Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· случаСв ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ измСряСмый ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ Π² Π΄Π²Π° Ρ€Π°Π·Π°, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ Ρ†Π΅Π»ΡŒ достигнута.

Π‘Π»Π°Π³ΠΎΠ΄Π°Ρ€ΡŽ Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅.

Как ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ врСмя выполнСния скрипта Python?

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ обсудим, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ врСмя выполнСния скрипта Python.

Π’ Python сущСствуСт мноТСство ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Python, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ time, timeit ΠΈ datetime, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ врСмя выполнСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠœΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΡƒΡ ΠΈΠ»ΠΈ получая Ρ€Π°Π·Π½ΠΈΡ†Ρƒ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ Π½Π°Ρ‡Π°Π»Π° ΠΈ окончания выполнСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π°, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ врСмя, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ для выполнСния Ρ€Π°Π·Π΄Π΅Π»Π°.

Для вычислСния Ρ€Π°Π·Π½ΠΈΡ†Ρ‹ Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹:

  • ΠœΠΎΠ΄ΡƒΠ»ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Python прСдоставляСт Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, связанныС со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ. Π­Ρ‚ΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ относится ΠΊ стандартным слуТСбным модулям Python. ΠΌΠ΅Ρ‚ΠΎΠ΄ time.time() модуля Time ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для получСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² сСкундах с Π½Π°Ρ‡Π°Π»Π° эпохи. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° високосных сСкунд зависит ΠΎΡ‚ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹.
  • ΠœΠΎΠ΄ΡƒΠ»ΡŒ Python datetime опрСдСляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π² основном ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для получСния Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ Π΄Π°Ρ‚Ρ‹. сСйчас() 9Ѐункция 0011 Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ Π΄Π°Ρ‚Ρƒ ΠΈ врСмя, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ datetime.
  • Python ΠœΠΎΠ΄ΡƒΠ»ΡŒ timeit запускаСт Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° n Ρ€Π°Π· (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ β€” 1000000), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ статистичСски Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Ρ€Π΅Π»Π΅Π²Π°Π½Ρ‚Π½ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΊΠΎΠ΄Π°.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния Python с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ модуля time-3. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ врСмя, ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ² количСство вычислСний с использованиСм Ρ‚Π΅Ρ… ΠΆΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ².

Python3

ΠΈΠΌΠΏΠΎΡ€Ρ‚ врСмя

Β 

Π½Π°Ρ‡Π°Π»ΠΎ = time.time()

Β 

a = 0

для i Π² Π”ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ( 1000 ):

Β Β Β Β  a + = (i * * 100 9004 1 )

Β 

ΠΊΠΎΠ½Π΅Ρ† = врСмя.врСмя()

Β 

print ( "ВрСмя выполнСния Π²Ρ‹ΡˆΠ΅ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:" ,

Β Β Β Β Β Β  (ΠΊΠΎΠ½Π΅Ρ† - Π½Π°Ρ‡Π°Π»ΠΎ) * 10 * * 3 , "мс" )

Π’Ρ‹Ρ…ΠΎΠ΄: 90 003

 ВрСмя выполнСния Π²Ρ‹ΡˆΠ΅ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹: 0,77056884765625 мс 

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2: Π˜Π·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ для сСгмСнт ΠΊΠΎΠ΄Π° ΠΏΡƒΡ‚Π΅ΠΌ суммирования Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ Π½Π° ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ для Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ количСства вычислСний. ΠœΡ‹ Π²ΠΈΠ΄ΠΈΠΌ ΠΎΠ±Ρ‰ΡƒΡŽ Ρ‚Π΅Π½Π΄Π΅Π½Ρ†ΠΈΡŽ ΠΊ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΡŽ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ вычислСний ΠΏΡ€ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠΈ числа Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ. Однако ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ Ρ‚Ρ€Π΅Π½Π΄ ΠΈΠ»ΠΈ фиксированныС приращСния.

Python3

ΠΈΠΌΠΏΠΎΡ€Ρ‚ врСмя

Β 

для j Π² ряд ( 100 , 5501 , 100 9 0041 ):

Β Β Β Β 

Β Β Β Β  Π½Π°Ρ‡Π°Π»ΠΎ = 0041 Β Β Β Β  a = 0

     для i в диапазон (j):

Β Β Β Β Β Β Β Β  a + = (i * * 100 )

Β Β Β Β 

Β Β Β Β  end = time. time()

Β 

Β Β Β Β 

Β Β Β Β  ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (f "Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΡ: {j}\tΠ—Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ врСмя: {(ΠΊΠΎΠ½Π΅Ρ†-Π½Π°Ρ‡Π°Π»ΠΎ)*10**3:.03f}мс" )

Π’Ρ‹Π²ΠΎΠ΄: 9 0003

 Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΡ: 100 Π—Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ врСмя: 0,105 мс
Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΡ: 200 Π—Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ врСмя: 0,191 мс
Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΡ: 300 Π—Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ врСмя: 0,291 мс
Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΡ: 400 Π—Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ врСмя: 0,398 мс
Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΡ: 500 Π—Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ врСмя: 0,504 мс
Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΡ: 600 Π—Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ врСмя: 0,613 мс
Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΡ: 700 Π—Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ врСмя: 0,791 мс
...
Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΡ: 5400 Π—Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ врСмя: 6,504 мс
Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΡ: 5500 Π—Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ врСмя: 6,630 мс 

ОбъяснСниС: Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ усСкли Π²Ρ‹Π²ΠΎΠ΄ для наглядности. Но Ссли ΠΌΡ‹ сравним ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΎΡ‚ 100 Π΄ΠΎ 700, Ρ‚ΠΎ ΠΎΠ½ΠΈ мСньшС 1 мс. Но Π±Π»ΠΈΠΆΠ΅ ΠΊ ΠΊΠΎΠ½Ρ†Ρƒ Ρ†ΠΈΠΊΠ»Π° каТдая итСрация Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ~ 7 мс. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, врСмя увСличиваСтся ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ увСличСния количСства ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это связано с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ Ρ†ΠΈΠΊΠ» повторяСтся большСС количСство Ρ€Π°Π· Π² зависимости ΠΎΡ‚ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ внСшнСй ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ.

ИспользованиС модуля DateTime для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния

ИспользованиС модуля datetime Π² Python ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ datetime.now() для записи ΠΌΠ΅Ρ‚ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π°Ρ‡Π°Π»Π° ΠΈ окончания экзСмпляра ΠΈ поиска Ρ€Π°Π·Π½ΠΈΡ†Ρ‹ для получСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΊΠΎΠ΄Π°.

Python3

ΠΈΠ· datetime ΠΈΠΌΠΏΠΎΡ€Ρ‚ datetime

Β  9000 3 Π½Π°Ρ‡Π°Π»ΠΎ = datetime.now()

Β 

a = 0

для i в диапазонС ( 1000 ):

9 0040 Β Β Β Β  a + = (i * * 100 )

Β 

ΠΊΠΎΠ½Π΅Ρ† = datetime.now()

Β 

td = (ΠΊΠΎΠ½Π΅Ρ† - start). total_seconds() * 10 * * 3

ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ 9 0042 (f "ВрСмя выполнСния Π²Ρ‹ΡˆΠ΅ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹: {td:. 03f}мс" )

Π’Ρ‹Π²ΠΎΠ΄:

 ВрСмя выполнСния Π²Ρ‹ΡˆΠ΅ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹: 0,766 мс 

ИспользованиС

timeit 90 ΠœΠΎΠ΄ΡƒΠ»ΡŒ 011 провСряСт врСмя выполнСния

Π­Ρ‚ΠΎ даст Π½Π°ΠΌ врСмя выполнСния любой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ . Π­Ρ‚ΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ прСдоставляСт простой способ Π½Π°ΠΉΡ‚ΠΈ врСмя выполнСния Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΠ΄Π° Python. Он прСдоставляСт ΠΌΠ΅Ρ‚ΠΎΠ΄ timeit() , Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎ ΠΆΠ΅ самоС. Ѐункция модуля timeit.timeit(stmt, setup, timer, number) ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°:

  • stmt β€” ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ; ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ это Β«ΠΏΡ€ΠΎΠΉΡ‚ΠΈΒ».
  • setup β€” это ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ запускаСтС ΠΏΠ΅Ρ€Π΅Π΄ запуском stmt; ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ это Β«ΠΏΡ€ΠΎΠΉΡ‚ΠΈΒ». ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ это для ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ для нашСго ΠΊΠΎΠ΄Π°.
  • Ρ‚Π°ΠΉΠΌΠ΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ timeit.Timer; ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π·ΡƒΠΌΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½Π΅ ΠΎ Ρ‡Π΅ΠΌ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ.
  • Число, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ прСдставляСт собой количСство Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ stmt.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1. ИспользованиС timeit Π²ΠΎ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΊΠΎΠ΄Π° Python для измСрСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния

Python3

ΠΈΠΌΠΏΠΎΡ€Ρ‚ timeit

Β 

mysetup 9004 1 = "ΠΈΠ· матСматичСского ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° sqrt"

Β 

mycode =

Β Β Β Β 

Β Β Β Β Β Β Β Β 

Β 

exec_time = timeit.timeit(stmt = ΠΌΠΎΠΉ ΠΊΠΎΠ΄,

Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β  настройка = mysetup,

Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β  Π½ΠΎΠΌΠ΅Ρ€ = 1000000 ) * 10 * * 3

ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (f «ВрСмя выполнСния Π²Ρ‹ΡˆΠ΅ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹: {exec_time:. 03f} мс» )

Π’Ρ‹Π²ΠΎΠ΄:

 ВрСмя выполнСния Π²Ρ‹ΡˆΠ΅ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹: 71,161 мс 

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2: ИспользованиС timeit ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки для измСрСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ врСмя, Π·Π°Ρ‚Ρ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌΠΎΠ΅ простыми ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ ΠΊΠΎΠ΄Π° Π±Π΅Π· нСобходимости ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Python, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ timeit CLI-интСрфСйс.

time ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ нСсколько Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнных Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²:

  • -s [–setup] : Код установки для запуска ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΊΠΎΠ΄Π°.
  • -n [–число ]: количСство Ρ€Π°Π· выполнСния инструкции.
  • – p [–process] : Π˜Π·ΠΌΠ΅Ρ€ΡŒΡ‚Π΅ врСмя выполнСния ΠΊΠΎΠ΄Π° вмСсто Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ настСнных часов.
  • ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ : ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΊΠΎΠ΄Π° для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния, взятыС Π² качСствС ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°.

timeit ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки:

 python -m timeit -s "import random" "l = [x**9 for x in range(random. randint(1000, 1500))]" 

Π’Ρ‹Π²ΠΎΠ΄:

 500 Ρ†ΠΈΠΊΠ»ΠΎΠ², Π»ΡƒΡ‡ΡˆΠΈΠΉ ΠΈΠ· 5: 503 использовано Π½Π° Ρ†ΠΈΠΊΠ» 

Как ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Python

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ научимся Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ врСмя, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ для выполнСния Π² Python . ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌΠΈ ΠΊΠΎΠ΄Π°ΠΌΠΈ. Π”Π°Π²Π°ΠΉΡ‚Π΅ сначала быстро рассмотрим, ΠΊΠ°ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ влияСт Π½Π° врСмя Π² Python.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚Ρ‹, Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ, часто ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Π»ΠΈΡΡŒ с ошибкой Β«ΠŸΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ΠΎ врСмя» ΠΏΡ€ΠΈ создании ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… сцСнариСв. Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ наши ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ Π»ΡƒΡ‡ΡˆΠ΅. Для этого Π½Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π·Π½Π°Ρ‚ΡŒ, сколько Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ трСбуСтся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ для Π΅Π΅ выполнСния. Π”Π°Π²Π°ΠΉΡ‚Π΅ обсудим Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ Python, для расчСта Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Python 9.0010 .

ВрСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Python ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π² зависимости ΠΎΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΎΠ²:

  1. Одна ΠΈ Ρ‚Π° ΠΆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ†Π΅Π½Π΅Π½Π° с использованиСм Ρ€Π°Π·Π½Ρ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ²
  2. ВрСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ зависит ΠΎΡ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°
  3. ВрСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ зависит ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ
  4. ВрСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ зависит ΠΎΡ‚ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°
  5. ВрСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ нСпрСдсказуСмо ΠΈΠ·-Π·Π° Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…

РасчСт Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ time()

ΠœΡ‹ вычисляСм врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ time. time() . Он ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ time , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для получСния Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ сохраняСтся врСмя Π½Π°Ρ‡Π°Π»Π° Π΄ΠΎ выполнСния Ρ†ΠΈΠΊΠ»Π° for, Π° Π·Π°Ρ‚Π΅ΠΌ сохраняСтся врСмя окончания послС выполнСния строки ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ. Π Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ окончания ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ Π½Π°Ρ‡Π°Π»Π° ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Ѐункция time.time() Π»ΡƒΡ‡ΡˆΠ΅ всСго ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π° *nix.

 врСмя ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°
#врСмя Π½Π°Ρ‡Π°Π»Π°
Π½Π°Ρ‡Π°Π»ΠΎ = врСмя.врСмя()
для i в диапазонС (3):
    Ρ€Π°ΡΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ("ΠŸΡ€ΠΈΠ²Π΅Ρ‚")
# врСмя окончания
ΠΊΠΎΠ½Π΅Ρ† = врСмя.врСмя()
# ΠΎΠ±Ρ‰Π΅Π΅ врСмя
print("ВрСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ - ", end-start) 


ΠŸΡ€ΠΈΠ²Π΅Ρ‚
ΠŸΡ€ΠΈΠ²Π΅Ρ‚
ΠŸΡ€ΠΈΠ²Π΅Ρ‚
ВрСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ 1.430511474609375e-05

Π Π°ΡΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ врСмя выполнСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ timeit()

ΠœΡ‹ вычисляСм врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ timeit() . Он ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ timeit . Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ являСтся врСмя выполнСния Π² сСкундах. Π­Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° запускаСтся ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Π·Π° Π΄Π΅ΡΡΡ‚ΡƒΡŽ долю сСкунды.

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ создаСтся пСрСмСнная ΠΈ вСсь ΠΊΠΎΠ΄, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΈΠΌΠΏΠΎΡ€Ρ‚, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ Π² Ρ‚Ρ€ΠΎΠΉΠ½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ. Код тСста дСйствуСт ΠΊΠ°ΠΊ строка. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ функция time.timeit() . Ѐункция timeit() ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ тСстовый ΠΊΠΎΠ΄ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, выполняСт Π΅Π³ΠΎ ΠΈ записываСт врСмя выполнСния. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ числового Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° установлСно Ρ€Π°Π²Π½Ρ‹ΠΌ 100 Ρ†ΠΈΠΊΠ»Π°ΠΌ.

 врСмя ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°
ΠΊΠΎΠ΄_тСста =Β """
Π° = Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ (100000)
Π± = []
для я в:
Π±. Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ (я + 2)
"""
total_time = timeit.timeit(test_code, число=200)
print("ВрСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ -",Β total_time) 


ВрСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ 4.26646219700342

Π Π°ΡΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ врСмя выполнСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ time.clock()

Π•Ρ‰Π΅ ΠΎΠ΄Π½Π° функция модуля time для измСрСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ β€” функция time.clock() . time.clock() измСряСт врСмя процСссора Π² систСмах Unix, Π° Π½Π΅ врСмя стСны. Π­Ρ‚Π° функция Π² основном ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ†Π΅Π»Π΅ΠΉ ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° ΠΈΠ»ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² синхронизации. time.clock() ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Ρ‡ΡƒΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Π²Ρ‹ΡΠΎΠΊΡƒΡŽ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ, Ρ‡Π΅ΠΌ time.time() . Он Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ врСмя процСссора, Ρ‡Ρ‚ΠΎ позволяСт Π½Π°ΠΌ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ врСмя, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ этим процСссом. Π›ΡƒΡ‡ΡˆΠ΅ всСго ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Windows.

 врСмя ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°
t0= врСмя.часы()
Ρ€Π°ΡΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ("ΠŸΡ€ΠΈΠ²Π΅Ρ‚")
t1 = врСмя.часы()Β -Β t0
print("ВрСмя истСкло: ",Β t1 – t0)Β ΠŸΡ€ΠΎΡˆΠ»ΠΎ # сСкунд ЦП (с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой) 


ΠŸΡ€ΠΈΠ²Π΅Ρ‚
ΠŸΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π΅ врСмя: -0,02442

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅:

time.clock() «Π£ΡΡ‚Π°Ρ€Π΅Π»ΠΎ, начиная с вСрсии 3.3». ПовСдСниС этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ зависит ΠΎΡ‚ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹. ВмСсто этого ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ perf_counter() ΠΈΠ»ΠΈ process_time() Π² зависимости ΠΎΡ‚ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΈΠ»ΠΈ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‡Π΅Ρ‚ΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.

time.perf_counter() β€” Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (Π² долях сСкунды) счСтчика ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Ρ‚. Π΅. часы с самым высоким доступным Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ для измСрСния ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Он Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ врСмя, ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π΅ Π²ΠΎ врСмя сна, ΠΈ являСтся общСсистСмным.

time.process_time() — Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (Π² долях сСкунды) суммы систСмного ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ процСссорного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ процСсса. Он Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ врСмя, ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π΅ Π²ΠΎ врСмя сна. НапримСр,

 Π½Π°Ρ‡Π°Π»ΠΎ = врСмя.процСсс_врСмя()
... сдСлай Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ
ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π΅ =Β (time.process_time()Β -Β Π½Π°Ρ‡Π°Π»ΠΎ) 90Β 159
  

Π Π°ΡΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ врСмя выполнСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ datetime.now()

ΠœΡ‹ вычисляСм ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π΅ врСмя, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ datetime.datetime.now() ΠΈΠ· модуля datetime , доступного Π² Python. Он Π½Π΅ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ скрипт Π² ΠΌΠ½ΠΎΠ³ΠΎΡΡ‚Ρ€ΠΎΡ‡Π½ΡƒΡŽ строку, ΠΊΠ°ΠΊ Π² timeit() . Π­Ρ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, Ρ‡Π΅ΠΌ timeit() , ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ вычислСниС Ρ€Π°Π·Π½ΠΈΡ†Ρ‹ Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ Π²ΠΎ врСмя выполнСния. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ прСдставлСн Π² Π²ΠΈΠ΄Π΅ Π΄Π½Π΅ΠΉ, часов, ΠΌΠΈΠ½ΡƒΡ‚ ΠΈ Ρ‚. Π΄.

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ врСмя сохраняСтся ΠΏΠ΅Ρ€Π΅Π΄ Π»ΡŽΠ±Ρ‹ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ datetime.datetime.now() послС выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ окончания ΠΈ Π½Π°Ρ‡Π°Π»Π° выполнСния.

 ΠΈΠΌΠΏΠΎΡ€Ρ‚ Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ
start =Β datetime.datetime.now()
список1 = [4, 2, 3, 1, 5]
список1.sort()
ΠΊΠΎΠ½Π΅Ρ† =Β datetime.datetime.now()
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (ΠΊΠΎΠ½Π΅Ρ†-Π½Π°Ρ‡Π°Π»ΠΎ) 


0:00:00.000007

Π’Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ врСмя выполнСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ %%time

ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ %%time 9Команда 0042 для расчСта Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π·Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ. Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π² основном ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с Jupyter Notebook . Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ врСмя стСны ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ячСйки.

 %%врСмя
[ x**2 для x в диапазонС (10000)] 90 159

ΠŸΠΎΡ‡Π΅ΠΌΡƒ timeit() β€” Π»ΡƒΡ‡ΡˆΠΈΠΉ способ ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ врСмя выполнСния ΠΊΠΎΠ΄Π° Python?

1. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ time.clock() Π² Windows ΠΈ time.time() Π² Mac ΠΈΠ»ΠΈ Linux. Однако timeit() Π±ΡƒΠ΄Π΅Ρ‚ автоматичСски ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ time.