TGViewer
PYTHON IN DEPTH🐍 PYTHON IN DEPTH🐍 @python_in_depth · 386 subscribers
Post #21 185
Какова ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ добавлСния элСмСнта Π² список?

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° этот вопрос, Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ, ΠΊΠ°ΠΊ списки устроСны Π½Π° Π½ΠΈΠ·ΠΊΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ списка Π² исходниках CPython выглядит Ρ‚Π°ΠΊ:

typedef struct {
PyObject_VAR_HEAD
PyObject **ob_item;
Py_ssize_t allocated;
} PyListObject;

Π—Π΄Π΅ΡΡŒ ob_item -- это Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½Ρ‹ΠΉ массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° элСмСнты списка, Π° allocated содСрТит Π΄Π»ΠΈΠ½Ρƒ массива. Π’ΠΎΡ‚ ΠΈ всС, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ Π½Π° вопросы ΠΎ слоТности ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ со списками.

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΎΡ‚ΡΡŽΠ΄Π° сразу Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π»ΠΈΠ½Ρƒ массива ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ быстро, Π·Π° O(1), ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ всС элСмСнты.

len(a) # O(1)

Π•Ρ‰Ρ‘ сразу понятно, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ индСксирования Π½Π΅ зависит ΠΎΡ‚ Π΄Π»ΠΈΠ½Ρ‹ списка ΠΈΠ»ΠΈ значСния индСкса, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ извСстному Π½ΠΎΠΌΠ΅Ρ€Ρƒ ячСйки Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠΆΠ΅ Π·Π° O(1).

a[10] = 5 # O(1)

А Π²ΠΎΡ‚ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² спискС, придСтся ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ссылку ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ содСрТимоС Π½Π° равСнство. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ -- опСрация дорогая, Π² Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС O(n).

5 in a # O(n)

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹Ρ… элСмСнтов Π² ΠΊΠΎΠ½Π΅Ρ† списка (ΠΌΠ΅Ρ‚ΠΎΠ΄ append()) Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π·Π° O(1). Но здСсь Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½Π° Π΄Π΅Ρ‚Π°Π»ΡŒ: мСсто Π² памяти для массива ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ аллоцируСтся Π·Π°Ρ€Π°Π½Π΅Π΅. И ΠΊΠΎΠ³Π΄Π° занятый объСм памяти истощаСтся, ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ выдСляСт Π΅Ρ‰Ρ‘ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 15% ΠΎΡ‚ объСма массива. Π­Ρ‚Π° пСриодичСская экспансия врСмя ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ нСсколько замСдляСт Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²Ρ‹Ρ… элСмСнтов Π² список, поэтому ΠΎΠ± O(1) ΠΌΠΎΠΆΠ½ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ условно.

a.append(5) # ~O(1)

Π•Ρ‰Π΅ ΠΎΠ΄Π½Π° распространСнная ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒ это ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ списки, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° +. Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ зависит ΠΎΡ‚ Π΄Π»ΠΈΠ½Ρ‹ присоСдиняСмого списка: Ссли Π΅Π³ΠΎ Π΄Π»ΠΈΠ½Π° 100 элСмСнтов, Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ 100 Ρ€Π°Π· Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΊΠΎΠ½Π΅Ρ† Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт.

a + b # ~O(k)

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ элСмСнтам слайса a[i:j], Π½ΡƒΠΆΠ½ΠΎ ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ индСксами i ΠΈ j. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ O(k), Π³Π΄Π΅ k -- Π΄Π»ΠΈΠ½Π° слайса. А Π²ΠΎΡ‚ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ слайс это O(n), ΠΈΠ·-Π·Π° нСобходимости ΡΠ΄Π²ΠΈΠ½ΡƒΡ‚ΡŒ всС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π·Π° ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΌ участком элСмСнты Π½Π° Π½ΠΎΠ²Ρ‹Π΅ мСста, здСсь n -- Π΄Π»ΠΈΠ½Π° всСго массива.

a[i:j] # ~O(k)
del a[i:j] # ~O(n)

ΠœΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΈ удаляСт послСдний элСмСнта списка pop(), ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(1), Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ pop(i) элСмСнта ΠΈΠ· сСрСдины списка Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ O(n). ΠŸΠΎΡ‡Π΅ΠΌΡƒ Ρ‚Π°ΠΊ? ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π±Ρ‹Π» ΡƒΠ΄Π°Π»Π΅Π½ ΠΈΠ· сСрСдины ΠΈΠ»ΠΈ Π½Π°Ρ‡Π°Π»Π°, Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π²ΠΈΠ½ΡƒΡ‚ΡŒ всС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π·Π° Π½ΠΈΠΌ Π½Π° 1 ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π²ΠΏΠ΅Ρ€Ρ‘Π΄. А ΠΊΠΎΠ³Π΄Π° элСмСнт Π±Ρ‹Π» ΡƒΠ΄Π°Π»Π΅Π½ ΠΈΠ· ΠΊΠΎΠ½Ρ†Π° массива, этого Π΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ. По этой ΠΆΠ΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ Π²Ρ‹Ρ‡Π»Π΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎ индСксу(pop) ΠΈΠ»ΠΈ вставка элСмСнта Π² сСрСдину списка Ρ‚ΠΎΠΆΠ΅ дорогая опСрация ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ O(n) ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.

a.pop() #O(1)
a.pop(i) #O(n)
a.insert(i, item) #O(n)

ΠžΠ±ΠΎΠ±Ρ‰ΠΈΠΌ:

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ
----------------------
len(a) O(1)
a[i] O(1)
a[10] = 5 O(1)
5 in a O(n)
a.append(5) ~O(1)
a + b O(k)
a[i:j] O(k)
del a[i:j] O(n)
a.pop() O(1)
a.pop(i) O(n)
a.insert(i, item) O(n)

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

Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС, ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ добавлСния элСмСнта Π² список зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π² сСрСдину массива ΠΌΡ‹ добавляСм элСмСнт ΠΈΠ»ΠΈ Π² ΠΊΠΎΠ½Π΅Ρ†. Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ элСмСнт Π² Π½Π°Ρ‡Π°Π»ΠΎ ΠΈΠ»ΠΈ сСрСдину списка это O(n), Π½ΠΎ опСрация append() Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ O(1)🐍
  • πŸ‘ 1
  • πŸ”₯ 1
More from @python_in_depth
  1. Feb 20, 2026Β«ΠŸΡƒΠ·Ρ‹Ρ€ΡŒ Π»ΠΎΠΏΠ½ΡƒΠ»Β», Β«Π°ΠΉΡ‚ΠΈ всё», Β«Ρ€Ρ‹Π½ΠΎΠΊ ΡƒΠΌΠ΅Ρ€Β» β€” ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Ρ‡ΠΈΡ‚Π°Π΅ΠΌ это с Π½ΠΎΠ²Ρ‹ΠΌ интСрСсом. Но да…
  2. Feb 18, 2026«Какой Π½Π°Π²Ρ‹ΠΊ самый Π²Π°ΠΆΠ½Ρ‹ΠΉ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°?Β» ΠžΡ‚Π²Π΅Ρ‚ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎ простой β€” ΡƒΠΌΠ΅Π½ΠΈΠ΅ ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ быс…
  3. Feb 9, 2026Как Π½Π° самом Π΄Π΅Π»Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΎΡ‚Π±ΠΎΡ€ Ρ€Π΅Π·ΡŽΠΌΠ΅ Π² 2026 Π³ΠΎΠ΄Ρƒ Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Π½Π°ΠΉΠΌ β€” это Π½Π΅ Β«Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ чит…
  4. Feb 2, 2026Π’Π°Ρˆ backend слишком слоТный. Π‘ΠΊΠΎΡ€Π΅Π΅ всСго β€” Π±Π΅Π· ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹. Π£ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΊΠΎΠΌΠ°Π½Π΄ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ра…
  5. Jan 29, 2026Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ с внСшними систСмами: ΠΊΠ°ΠΊ Π½Π΅ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ backend Π² Π·ΠΎΠΎΠΏΠ°Ρ€ΠΊ Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ΠΎΠ² Π Π°Π½ΠΎ ΠΈΠ»ΠΈ по…
  6. Jan 29, 2025Π•Π΅Π΅Π΅Π΅Π΅Π΅, Π° Ρ‡Π΅ ΠΌΡ‹ Π½Π°Π΄ js смССмся
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook β†’Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 β†’