ЁЯУИ рдзрдбрд╛ 04 тАФ рдкреНрд░рддреНрдпрдХреНрд╖рд╛рддрд▓реА complexity: рдЬреЛрдбреА-рдЬреЛрдбреАрдиреЗ, рдХреА рдЖрдзреА sort?
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 04 ┬╖ рдорд╛рдЧреЗ: lesson-03-profiling ┬╖ рдкреБрдвреЗ: lesson-05-memory
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ03, рдЕрдзрд┐рдХ algorithmic complexity, рдкрд╛рда рдХрд░реВрди рдирд╡реНрд╣реЗ рддрд░ рдореЛрдЬреВрди: рдПрдХрдЪ
рдкреНрд░рд╢реНрди тАФ "рдХреЛрдгрддреЗ bib рдХреНрд░рдорд╛рдВрдХ рджреЛрдирджрд╛ рдЖрд▓реЗ рдЖрд╣реЗрдд рдХрд╛?" тАФ рддреАрди рдкреНрд░рдХрд╛рд░реЗ рд╕реЛрдбрд╡рд▓реЗрд▓рд╛, рдкреНрд░рддреНрдпреЗрдХ
comparison рдореЛрдЬреВрди: рдкреНрд░рддреНрдпреЗрдХ рдЬреЛрдбреА (O(n┬▓)), рдЖрдзреА sort рдХрд░реВрди рдордЧ рд╢реЗрдЬрд╛рд░реА рддрдкрд╛рд╕рдгреЗ (O(n log n)),
рдЖрдгрд┐ set (рд╕рд░рд╛рд╕рд░реА O(n)). perf/demo.py рдордзрд▓реЗ complexity() рдЖрдгрд┐
perf/sim.py рдордзрд▓реЗ dup_pairs, dup_sorted, merge_sort рдЖрдгрд┐ dup_set.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╢рд░реНрдпрддреАрдЖрдзреА рдкреНрд░рддреНрдпреЗрдХ рдзрд╛рд╡рдкрдЯреВрд▓рд╛ рдПрдХ bib рдХреНрд░рдорд╛рдВрдХ рдорд┐рд│рддреЛ. ЁЯФв рджреЛрди рдзрд╛рд╡рдкрдЯреВрдВрдЪрд╛ рдХреНрд░рдорд╛рдВрдХ рдХрдзреАрдЪ рд╕рд╛рд░рдЦрд╛ рдЕрд╕рддрд╛ рдХрд╛рдорд╛ рдирдпреЗ. рдРрд╢реНрд╡рд░реНрдпрд╛рд▓рд╛ рд╣реЗ рддрдкрд╛рд╕рд╛рдпрдЪреЗ рдЖрд╣реЗ.
- рдкрджреНрдзрдд 1 тАФ рдкреНрд░рддреНрдпреЗрдХ рдЬреЛрдбреА: рдзрд╛рд╡рдкрдЯреВ 1 рдШреНрдпрд╛, рддреНрдпрд╛рдЪреА рдкреНрд░рддреНрдпреЗрдХ рдЗрддрд░ рдзрд╛рд╡рдкрдЯреВрд╢реА рддреБрд▓рдирд╛ рдХрд░рд╛. рдордЧ рдзрд╛рд╡рдкрдЯреВ 2 рдЪреА рддреНрдпрд╛рдирдВрддрд░рдЪреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХрд╛рд╢реА. рдЕрд╕реЗрдЪ рдкреБрдвреЗ. 250 рдзрд╛рд╡рдкрдЯреВрдВрд╕рд╛рдареА 31,125 рддрдкрд╛рд╕рдгреНрдпрд╛. 2000 рдзрд╛рд╡рдкрдЯреВрдВрд╕рд╛рдареА рдЬрд╡рд│рдЬрд╡рд│ 2 million. рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА рд╢рд╛рд│рд╛ рджреБрдкреНрдкрдЯ рд╣реЛрддреЗ, рддреЗрд╡реНрд╣рд╛ рдХрд╛рдо рдЪреМрдкрдЯ рд╣реЛрддреЗ. ЁЯШ╡
- рдкрджреНрдзрдд 2 тАФ рдЖрдзреА sort: рдзрд╛рд╡рдкрдЯреВрдВрдирд╛ bib рдХреНрд░рдорд╛рдВрдХрд╛рдиреБрд╕рд╛рд░ рд░рд╛рдВрдЧреЗрдд рдЙрднреЗ рдХрд░рд╛. рдЖрддрд╛ рдХреЛрдгрддреЗрд╣реА рджреЛрди рд╕рд╛рд░рдЦреЗ рдХреНрд░рдорд╛рдВрдХ рдПрдХрдореЗрдХрд╛рдВрдЪреНрдпрд╛ рд╢реЗрдЬрд╛рд░реАрдЪ рдЙрднреЗ рдЕрд╕рд▓реЗ рдкрд╛рд╣рд┐рдЬреЗрдд. Sort рдХрд░рд╛рдпрд▓рд╛ рдХрд╛рд╣реА рддрдкрд╛рд╕рдгреНрдпрд╛ рд▓рд╛рдЧрддрд╛рдд, рдордЧ рд░рд╛рдВрдЧреЗрд╡рд░реВрди рдПрдХрджрд╛ рдирдЬрд░. 2000 рдзрд╛рд╡рдкрдЯреВрдВрд╕рд╛рдареА: рд╕реБрдорд╛рд░реЗ 21,000 рддрдкрд╛рд╕рдгреНрдпрд╛.
- рдкрджреНрдзрдд 3 тАФ рдЦреБрдгрд╛рдВрдЪрд╛ рдХрд╛рдЧрдж: рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрднрд╛рд╡реНрдп рдХреНрд░рдорд╛рдВрдХрд╛рд╕рд╛рдареА рдПрдХ рдЪреМрдХреЛрди рдЕрд╕рд▓реЗрд▓рд╛ рдХрд╛рдЧрдж. рдкреНрд░рддреНрдпреЗрдХ рдзрд╛рд╡рдкрдЯреВрд╕рд╛рдареА, рддреНрдпрд╛рдЪрд╛ рдЪреМрдХреЛрди рдкрд╛рд╣рд╛: рдЖрдзреАрдЪ рдЦреВрдг рдЖрд╣реЗ? рджреБрд╣реЗрд░реА! рдирд╕реЗрд▓, рддрд░ рдЦреВрдг рдХрд░рд╛. рдкреНрд░рддреНрдпреЗрдХ рдзрд╛рд╡рдкрдЯреВрд╕рд╛рдареА рдПрдХ рдирдЬрд░: 2000.
рдкреНрд░рддреНрдпреЗрдХ рдкрджреНрдзрддреАрдЪреЗ рдЙрддреНрддрд░ рдПрдХрдЪ. рдХрд╛рдорд╛рдЪреЗ рдкреНрд░рдорд╛рдг рдорд╛рддреНрд░ рдЦреВрдк рд╡реЗрдЧрд╡реЗрдЧрд│реЗ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
q["тЭУ any duplicate bib<br/>among n runners?"] --> a["every pair ┬╖ O(n┬▓)<br/>n = 2000 тЖТ 1,999,000"]
q --> b["sort + neighbours ┬╖ O(n log n)<br/>n = 2000 тЖТ 21,436"]
q --> c["a set ┬╖ O(n)<br/>n = 2000 тЖТ 2,000"]
a --> g["double n тЖТ 4├Ч the work"]
b --> h["double n тЖТ a bit over 2├Ч"]
c --> i["double n тЖТ 2├Ч"]
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрдХреГрддреА + рдПрдХ lab: https://school-edh.pages.dev/performance/lesson-diagrams.html#l04
тЭУ рдХрд╛рдп
- Big-O тАФ input рд╡рд╛рдврд▓реНрдпрд╛рд╡рд░ рдХрд╛рдо рдХрд╕реЗ рд╡рд╛рдврддреЗ рддреЗ, constant factors рджреБрд░реНрд▓рдХреНрд╖рд┐рдд рдХрд░реВрди. O(n): input рджреБрдкреНрдкрдЯ, рдХрд╛рдо рджреБрдкреНрдкрдЯ. O(n┬▓): input рджреБрдкреНрдкрдЯ, рдХрд╛рдо рдЪреМрдкрдЯ. O(n log n): рджреБрдкреНрдкрдЯреАрдкреЗрдХреНрд╖рд╛ рдереЛрдбреЗ рдЬрд╛рд╕реНрдд. рддреЗ рдПрдХрд╛ рдЖрдХрд╛рд░рд╛рд╕рд╛рдареА рд▓рд╛рдЧрдгрд╛рд░рд╛ рд╡реЗрд│ рд╕рд╛рдВрдЧрдд рдирд╛рд╣реА тАФ рдлрдХреНрдд рд╡рд╛рдвреАрдЪрд╛ рдЖрдХрд╛рд░ рд╕рд╛рдВрдЧрддреЗ.
- Worst, average рдЖрдгрд┐ best case тАФ lab рдЪреНрдпрд╛ bibs рдордзреНрдпреЗ рдПрдХрд╣реА рджреБрд╣реЗрд░реА рдХреНрд░рдорд╛рдВрдХ рдирд╛рд╣реА, рдореНрд╣рдгреВрди рдкреНрд░рддреНрдпреЗрдХ рдкрджреНрдзрдд рдЖрдкрд▓реЗ рдкреВрд░реНрдг рдХрд╛рдо рдХрд░рддреЗ (worst case). рджреБрд╣реЗрд░реА рдХреНрд░рдорд╛рдВрдХ рдЕрд╕реЗрд▓, рддрд░ рдкрджреНрдзрдд рд▓рд╡рдХрд░ рдерд╛рдВрдмреВ рд╢рдХрддреЗ.
- рдкреНрд░рддреНрдпреЗрдХ рдЬреЛрдбреА тАФ n(nтИТ1)/2 comparisons. n = 2000 рд╡рд░: 1,999,000.
- Sort + рд╢реЗрдЬрд╛рд░реА тАФ lab рдЕрд╕рд╛ merge sort рд╡рд╛рдкрд░рддреЗ рдЬреЛ рдЖрдкрд▓реА comparisons рдореЛрдЬрддреЛ (рд╕реБрдорд╛рд░реЗ
n┬╖logтВВn), рдордЧ nтИТ1 рд╢реЗрдЬрд╛рд░реА-рддрдкрд╛рд╕рдгреНрдпрд╛. Python рдЪреЗ рд╕реНрд╡рддрдГрдЪреЗ
sorted()(Timsort, рдЖрдгрд┐ 3.11 рдкрд╛рд╕реВрди "powersort" merge policy рд╕рд╣) рд╕реБрджреНрдзрд╛ O(n log n) рдЖрд╣реЗ, рдЖрдгрд┐ рдЖрдзреАрдЪ рдЕрдВрд╢рддрдГ sorted рдЕрд╕рд▓реЗрд▓реНрдпрд╛ data рд╡рд░ рдЦреВрдк рдЬрд▓рдж рдЖрд╣реЗ. - Hash set тАФ
x in some_setрд▓рд╛ рдЖрдХрд╛рд░ рдХрд┐рддреАрд╣реА рдЕрд╕рд▓рд╛ рддрд░реА рд╕рд╛рдзрд╛рд░рдг рддреЗрд╡рдврд╛рдЪ рдЦрд░реНрдЪ рдпреЗрддреЛ (рд╕рд░рд╛рд╕рд░реА O(1); рдЕрдиреЗрдХ hash collisions рддреНрдпрд╛рд▓рд╛ рд╣рд│реВ рдХрд░реВ рд╢рдХрддрд╛рдд). рдореНрд╣рдгреВрди рдПрдХ pass рд╕рд░рд╛рд╕рд░реА O(n) рдЖрд╣реЗ. - рдиреЗрд╣рдореАрдЪрд╛ рд▓рдкрд▓реЗрд▓рд╛ O(n┬▓) тАФ рджреБрд╕рд▒реНрдпрд╛ list рд╡рд░рдЪреНрдпрд╛ loop рдЪреНрдпрд╛ рдЖрдд
if x in some_list. рдкреНрд░рддреНрдпреЗрдХinlist рдЪрд╛рд│рддреЛ. рддреЗ рдПрдХрд╛ рдУрд│реАрд╕рд╛рд░рдЦреЗ рджрд┐рд╕рддреЗ; рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд loop рдЪреНрдпрд╛ рдЖрдд loop рдЖрд╣реЗ. рдзрдбрд╛ 03 рдордзрд▓реЗfind_runnerрд╣реЗрдЪ рд╣реЛрддреЗ. - Constants рдЕрдЬреВрдирд╣реА рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ тАФ рд▓рд╣рд╛рди n рд╕рд╛рдареА, рдХрдореА overhead рдЕрд╕рд▓реЗрд▓рд╛ "рд╡рд╛рдИрдЯ" algorithm рдЬрд┐рдВрдХреВ рд╢рдХрддреЛ. Big-O рд╕рд╛рдВрдЧрддреЗ n рдореЛрдард╛ рдЭрд╛рд▓реНрдпрд╛рд╡рд░ рдХрд╛рдп рд╣реЛрддреЗ тАФ рдЖрдгрд┐ рддреЗрд╡реНрд╣рд╛рдЪ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рд│рдЬреА рдЕрд╕рддреЗ.
рдпрд╛рдорд╛рдЧрдЪреА data structures (sorting, hashing, trees) рд╣рд╛ DSA school рдЪрд╛ рд╡рд┐рд╖рдп рдЖрд╣реЗ.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг рдХрд┐рддреАрд╣реА tuning рдХреЗрд▓реЗ рддрд░реА рдЪреБрдХреАрдЪрд╛ algorithm рд╡рд╛рдЪрдд рдирд╛рд╣реА. рдЬреЛрдбреА-рдЬреЛрдбреАрдЪрд╛ loop рджреБрдкреНрдкрдЯ рдЬрд▓рдж рдХреЗрд▓реНрдпрд╛рдиреЗ рд╢рд╛рд│реЗрдЪрд╛ рдЖрдХрд╛рд░ рдлрдХреНрдд рдПрдХрджрд╛ рджреБрдкреНрдкрдЯ рд╣реЛрдИрдкрд░реНрдпрдВрдд рд╡реЗрд│ рдорд┐рд│рддреЛ; рддреНрдпрд╛рдирдВрддрд░ рддреЛ рдкреБрдиреНрд╣рд╛ рд╣рд│реВ рд╣реЛрддреЛ. O(n┬▓) рдмрджрд▓реВрди O(n log n) рдХреЗрд▓реНрдпрд╛рдиреЗ рд╕рдВрдкреВрд░реНрдг рд╡рдХреНрд░рд░реЗрд╖рд╛рдЪ рдмрджрд▓рддреЗ. рдЖрдгрд┐ complexity bugs tests рдордзреНрдпреЗ рд▓рдкрддрд╛рдд: 20 rows рд╡рд░ рдкреНрд░рддреНрдпреЗрдХ рдкрджреНрдзрдд рдХреНрд╖рдгрд╛рдд рд╣реЛрддреЗ. рддреЗ production рдордзреНрдпреЗ рджрд┐рд╕рддрд╛рдд, рдЬреНрдпрд╛ рджрд┐рд╡рд╢реА data рдореЛрдард╛ рд╣реЛрддреЛ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
perf/sim.py рдордзрд▓реЗ bibs(n) seeded random рдХреНрд░рдорд╛рдиреЗ n рд╡реЗрдЧрд╡реЗрдЧрд│реЗ рдХреНрд░рдорд╛рдВрдХ
рджреЗрддреЗ. dup_pairs рдкреНрд░рддреНрдпреЗрдХ рдЬреЛрдбреАрдЪреА рддреБрд▓рдирд╛ рдХрд░рддреЗ; dup_sorted merge_sort(xs, count) call рдХрд░рддреЗ тАФ рдПрдХ
рд╕рд╛рдзрд╛ merge sort рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ comparison рд╕рд╛рдареА count[0] рдордзреНрдпреЗ 1 рдЬреЛрдбрддреЛ тАФ рдордЧ рд╢реЗрдЬрд╛рд░реА рддрдкрд╛рд╕рддреЗ; dup_set
рдкреНрд░рддреНрдпреЗрдХ item рд╕рд╛рдареА рдПрдХ set lookup рдХрд░рддреЗ. рдкреНрд░рддреНрдпреЗрдХ (found a duplicate?, comparisons) рдкрд░рдд рджреЗрддреЗ.
perf/demo.py рдордзрд▓реЗ complexity() n рд▓рд╛ 250 рдкрд╛рд╕реВрди 2000 рдкрд░реНрдпрдВрдд рджреБрдкреНрдкрдЯ рдХрд░рдд рдЬрд╛рддреЗ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 perf/demo.py complexity
python3 - <<'EOF'
import math, sys; sys.path.insert(0, "perf"); from sim import bibs, dup_pairs, dup_sorted
for n in (1000, 2000, 4000):
b = bibs(n); srt = dup_sorted(b)[1]
print(f"n {n:>5}: every pair n(n-1)/2 = {n * (n - 1) // 2:>9,} ┬╖ merge sort + scan {srt:>6,} ┬╖ n┬╖log2(n) = {round(n * math.log2(n)):>6,}")
b = bibs(1000); b[700] = b[3]
print("with one duplicate: every pair", dup_pairs(b), "┬╖ sorted", dup_sorted(b))
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
complexity рд╣реЗ рдЫрд╛рдкрддреЗ:
n every pair O(n┬▓) sort + neighbours O(n log n) a set O(n)
250 31,125 1,921 250
500 124,750 4,355 500
1000 499,500 9,724 1,000
2000 1,999,000 21,436 2,000
double n: every pair does 4├Ч the work ┬╖ sorting a little over 2├Ч ┬╖ the set exactly 2├Ч
big-O is how the work GROWS; at n = 2000 the pairwise way already does 93├Ч the comparisons of sorting
рддреБрдордЪрд╛ snippet рд╣реЗ рдЫрд╛рдкрддреЛ:
n 1000: every pair n(n-1)/2 = 499,500 ┬╖ merge sort + scan 9,724 ┬╖ n┬╖log2(n) = 9,966
n 2000: every pair n(n-1)/2 = 1,999,000 ┬╖ merge sort + scan 21,436 ┬╖ n┬╖log2(n) = 21,932
n 4000: every pair n(n-1)/2 = 7,998,000 ┬╖ merge sort + scan 46,873 ┬╖ n┬╖log2(n) = 47,863
with one duplicate: every pair (True, 3691) ┬╖ sorted (True, 9439)
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
Counts рд╕реВрддреНрд░рд╛рдВрдиреБрд╕рд╛рд░рдЪ рдпреЗрддрд╛рдд: рдкреНрд░рддреНрдпреЗрдХ рдЬреЛрдбреА рдореНрд╣рдгрдЬреЗ рдиреЗрдордХреЗ n(nтИТ1)/2, рдЖрдгрд┐ merge sort n┬╖logтВВn рдЪреНрдпрд╛ рдХрд┐рдВрдЪрд┐рдд рдЦрд╛рд▓реА рд░рд╛рд╣рддреЛ. 250 рддреЗ 2000 рдзрд╛рд╡рдкрдЯреВ (8├Ч рдЬрд╛рд╕реНрдд), рдЬреЛрдбреА-рдЬреЛрдбреАрдЪреНрдпрд╛ рдкрджреНрдзрддреАрдиреЗ 64├Ч рдЬрд╛рд╕реНрдд рдХрд╛рдо рдХреЗрд▓реЗ, sort рдиреЗ рд╕реБрдорд╛рд░реЗ 11├Ч, set рдиреЗ 8├Ч. рдореБрджреНрджрд╛рдо рдареЗрд╡рд▓реЗрд▓реНрдпрд╛ рджреБрд╣реЗрд░реА рдХреНрд░рдорд╛рдВрдХрд╛рд╕рд╣, рдЬреЛрдбреА-рдЬреЛрдбреАрдЪреА рдкрджреНрдзрдд 3,691 comparisons рдирдВрддрд░ рдерд╛рдВрдмрд▓реА тАФ рдЗрдереЗ рдирд╢реАрдм рдЪрд╛рдВрдЧрд▓реЗ рд╣реЛрддреЗ, рдХрд╛рд░рдг рджреБрд╣реЗрд░реА рдХреНрд░рдорд╛рдВрдХ рд╕реБрд░реБрд╡рд╛рддреАрдЬрд╡рд│ рд╣реЛрддрд╛; рддреБрдореНрд╣реА рдирд╢рд┐рдмрд╛рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рд░рд╛рд╣реВ рд╢рдХрдд рдирд╛рд╣реА.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- loop рдЪреНрдпрд╛ рдЖрдд
if item in a_listтАФ membership рд╕рд╛рдареАsetрдХрд┐рдВрд╡рд╛dictрд╡рд╛рдкрд░рд╛ - loop рдЪреНрдпрд╛ рдЖрдд sort рдХрд░рдгреЗ (рдПрдХрджрд╛рдЪ, рдмрд╛рд╣реЗрд░ sort рдХрд░рд╛)
- test data рдЪреНрдпрд╛ 10 rows рд╡рд░реВрди algorithm рдЪреА рдкрд░реАрдХреНрд╖рд╛ рдШреЗрдгреЗ
- рдЬреНрдпрд╛ languages рдордзреНрдпреЗ loop рдордзреНрдпреЗ
+=рдиреЗ string рдмрдирд╡рд▓реНрдпрд╛рд╕ рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА рд╕рдВрдкреВрд░реНрдг string copy рд╣реЛрддреЗ рддрд┐рдереЗ рддрд╕реЗ рдХрд░рдгреЗ (Python рдордзреНрдпреЗ, рддреБрдХрдбреЗ list рдордзреНрдпреЗ рдЧреЛрд│рд╛ рдХрд░рд╛ рдЖрдгрд┐"".joinрдХрд░рд╛) - рдЬрд┐рдереЗ n рдиреЗрд╣рдореАрдЪ рд▓рд╣рд╛рди рдЕрд╕рддреЛ рддрд┐рдереЗ complexity рдЪреНрдпрд╛ рдорд╛рдЧреЗ рд▓рд╛рдЧрдгреЗ тАФ рдЖрдзреА profile рдХрд░рд╛ (рдзрдбрд╛ 03)
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
рджреБрдкрдЯреАрдЪреНрдпрд╛ test рдиреЗ рдХрд╛рдо рдХрд╕реЗ рд╡рд╛рдврддреЗ рддреЗ рддрдкрд╛рд╕рд╛: рдХрд╛рдо n, 2n рдЖрдгрд┐ 4n рд╡рд░ рдореЛрдЬрд╛ (рд╡реЗрд│ рдХрд┐рдВрд╡рд╛ count). рдЬрд░ рдкреНрд░рддреНрдпреЗрдХ рджреБрдкрдЯреАрд▓рд╛ рд╕реБрдорд╛рд░реЗ 4├Ч рдЬрд╛рд╕реНрдд рд╡реЗрд│ рд▓рд╛рдЧрдд рдЕрд╕реЗрд▓, рддрд░ рдХреБрдареЗрддрд░реА O(n┬▓) рдЖрд╣реЗ. рдЦрд▒реНрдпрд╛ machine рд╡рд░:
for n in 1000 2000 4000; do
python3 -c "import time; xs=list(range($n)); t=time.perf_counter(); [x for x in xs if x in xs]; print($n, round(time.perf_counter()-t, 3), 's')"
done # x in a list, inside a loop: each doubling тЙИ 4├Ч the time
рдХрд╛рдо рдХрдореА рдареЗрд╡рдгрд╛рд░реА standard-library tools:
import bisect, heapq
from collections import Counter
dupes = [b for b, c in Counter(bibs).items() if c > 1] # O(n) with a hash map
top10 = heapq.nsmallest(10, laps) # O(n log 10), no full sort
i = bisect.bisect_left(sorted_bibs, 1234) # O(log n) lookup in sorted data
ЁЯПн Production рдордзреНрдпреЗ рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ: рдЬреЗрд╡реНрд╣рд╛ рдПрдЦрд╛рджреНрдпрд╛ job рдЪрд╛ рд╡реЗрд│ рддреНрдпрд╛рдЪреНрдпрд╛ data рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рд╡реЗрдЧрд╛рдиреЗ рд╡рд╛рдврддреЛ, рддреЗрд╡реНрд╣рд╛ loop рдЪреНрдпрд╛ рдЖрддрд▓рд╛ loop рд╢реЛрдзрд╛ тАФ рдмрд▒реНрдпрд╛рдЪрджрд╛ list рд╡рд░рдЪрд╛
in, рдкреНрд░рддреНрдпреЗрдХ row рд╕рд╛рдареА рдПрдХ query, рдХрд┐рдВрд╡рд╛ рдкреНрд░рддреНрдпреЗрдХ item рд╕рд╛рдареА рдПрдХ sort.
тПня╕П рдкреБрдвреЗ
рд╡реЗрд│ рд╣рд╛ рдПрдХ рдЦрд░реНрдЪ рдЖрд╣реЗ. Memory рд╣рд╛ рджреБрд╕рд░рд╛: рд╕рдЧрд│реЗ рдПрдХрджрдо рдзрд░реВрди рдареЗрд╡рдгреЗ, рдХреА рдПрдХрд╛ рд╡реЗрд│реА рдПрдХ item.
рдкреБрдвреЗ: lists, generators рдЖрдгрд┐ tracemalloc.
git checkout lesson-05-memory