Collections-moduulin vaativuus
Moduuli collections tarjoaa erikoistuneita tietorakenteita, jotka on optimoitu tiettyihin käyttötarkoituksiin.
deque
Deque (kaksipäinen jono)
from collections import deque
Aikavaativuus
| Operaatio |
Aika |
Tila |
Huomiot |
append(x) |
O(1) |
O(1) |
Lisää oikeaan päähän |
appendleft(x) |
O(1) |
O(1) |
Lisää vasempaan päähän |
pop() |
O(1) |
O(1) |
Poistaa oikeasta päästä |
popleft() |
O(1) |
O(1) |
Poistaa vasemmasta päästä |
access[i] |
O(1) ends, O(n) middle |
O(1) |
Päät (d[0], d[-1]) ovat O(1); keskellä olevat alkiot O(n) lohkorakenteen vuoksi |
extend(iterable) |
O(k) |
O(k) |
k = iteroituvan pituus |
extendleft(iterable) |
O(k) |
O(k) |
k = iteroituvan pituus; huom. kääntää järjestyksen |
rotate(n) |
O(k) |
O(1) |
k = min(n, len(d) - n) |
clear() |
O(n) |
O(1) |
Poistaa kaikki alkiot |
copy() |
O(n) |
O(n) |
Pinnallinen kopio |
count(x) |
O(n) |
O(1) |
Laskee x:n esiintymät |
index(x) |
O(n) |
O(1) |
Etsii x:n ensimmäisen esiintymän |
insert(i, x) |
O(n) |
O(1) |
Lisää x:n kohtaan i |
remove(x) |
O(n) |
O(1) |
Poistaa x:n ensimmäisen esiintymän |
reverse() |
O(n) |
O(1) |
Kääntää paikallaan |
in (membership) |
O(n) |
O(1) |
Lineaarinen haku |
Attribuutit
| Attribuutti |
Huomiot |
maxlen |
Enimmäiskoko (None jos rajoittamaton); vain luku |
Tilavaativuus
- Tallennus: O(n) n alkiolle
- Operaatiot: O(1) lisäys- ja poisto-operaatioille
Käyttötapaukset
# Process items from both ends - very efficient
queue = deque([1, 2, 3])
queue.appendleft(0) # O(1) - add to front
queue.pop() # O(1) - remove from back
# Much faster than list for this pattern:
# list.insert(0, x) is O(n)
# list.pop(0) is O(n)
DefaultDict
from collections import defaultdict
Aikavaativuus
Sama kuin dict:
| Operaatio |
Aika |
Tila |
Huomiot |
d[key] |
O(1) avg |
O(1) |
Palauttaa oletusarvon jos puuttuu; pahimmillaan O(n) tiivistetörmäysten vuoksi |
d[key] = value |
O(1) avg |
O(1) |
Pahimmillaan O(n) tiivistetörmäysten vuoksi |
del d[key] |
O(1) avg |
O(1) |
Pahimmillaan O(n) tiivistetörmäysten vuoksi |
copy() |
O(n) |
O(n) |
Pinnallinen kopio |
| Muut dict-operaatiot |
Sama kuin dict |
- |
|
Attribuutit
| Attribuutti |
Huomiot |
default_factory |
Kutsuttava, joka tuottaa oletusarvot; voi olla None |
Tilavaativuus
- O(n) n avain-arvo-parille
- Oletustehdasta kutsutaan vain, kun avainta haetaan
Käyttötapaukset
# Avoid: Manual checking
from collections import defaultdict
data = defaultdict(list)
data['key'].append('value') # Key auto-created as empty list
# Avoid: Clunky dict.get()
count = d.get('key', 0)
count += 1
# Better: defaultdict with int
from collections import defaultdict
count = defaultdict(int)
count['key'] += 1
Counter
from collections import Counter
Aikavaativuus
| Operaatio |
Aika |
Tila |
Huomiot |
Counter(iterable) |
O(n) |
O(k) |
n = iteroituvan pituus, k = uniikkien alkioiden määrä |
c[item] |
O(1) avg |
O(1) |
Palauttaa 0 jos puuttuu; pahimmillaan O(n) tiivistetörmäysten vuoksi |
c.most_common(k) |
O(n log k) |
O(k) |
Kekopohjainen; O(n log n) jos k on None |
c.update(iterable) |
O(n) |
O(k) |
n = iteroituvan pituus |
c.subtract(iterable) |
O(n) |
O(1) |
Vähentää lukumääriä; säilyttää negatiiviset arvot |
c.total() |
O(n) |
O(1) |
Kaikkien lukumäärien summa (Python 3.10+) |
c.elements() |
O(1) init, O(total) iter |
O(1) |
Iteraattori, joka toistaa kunkin alkion sen lukumäärän verran |
c.copy() |
O(n) |
O(n) |
Pinnallinen kopio |
c.fromkeys(iterable) |
N/A |
- |
Ei hyödyllinen Counterille; peritty sanakirjalta |
c + c2 |
O(n) |
O(n) |
Yhdistää laskurit; säilyttää positiiviset lukumäärät |
c - c2 |
O(n) |
O(n) |
Vähentää; säilyttää positiiviset lukumäärät |
Käyttötapaukset
from collections import Counter
# Count items
words = ['apple', 'banana', 'apple', 'cherry', 'apple']
c = Counter(words)
# Counter({'apple': 3, 'banana': 1, 'cherry': 1})
# Most common items
top_3 = c.most_common(3) # [('apple', 3), ('banana', 1), ('cherry', 1)]
# Arithmetic
c1 = Counter('aab')
c2 = Counter('abc')
c1 + c2 # Counter({'a': 3, 'b': 2, 'c': 1})
NamedTuple
from collections import namedtuple
Aikavaativuus
Sama kuin monikolla kaikissa operaatioissa:
| Operaatio |
Aika |
Tila |
Huomiot |
| Luonti |
O(1) |
O(1) |
Kiinteä määrä kenttiä |
| Haku indeksillä |
O(1) |
O(1) |
Sama kuin monikolla |
| Haku nimellä |
O(1) |
O(1) |
Sama kuin monikolla |
| Iterointi |
O(n) |
O(1) |
n = kenttien lukumäärä |
Käyttötapaukset
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(11, y=22)
# Better than plain tuple
print(p.x) # More readable than p[0]
# Create from dict
d = {'x': 1, 'y': 2}
p = Point(**d)
# Replace values
p2 = p._replace(x=5)
OrderedDict
from collections import OrderedDict
Aikavaativuus
| Operaatio |
Aika |
Tila |
Huomiot |
| Sama kuin dict |
O(1) |
O(1) |
Kaikki dict-operaatiot |
move_to_end(key) |
O(1) |
O(1) |
Siirtää avaimen loppuun |
Huomioita
-
Python 3.6+: Tavallinen dict säilyttää järjestyksen, joten OrderedDict on hyödyllinen lähinnä seuraaviin:
-
Yhteensopivuus vanhemman koodin kanssa
move_to_end()-metodi järjestyksen muuttamiseen
- Aikomuksen ilmaiseminen koodissa selkeästi
from collections import OrderedDict
# Useful method: move_to_end()
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
od.move_to_end('a') # O(1) - moves 'a' to end
ChainMap
from collections import ChainMap
Aikavaativuus
| Operaatio |
Aika |
Tila |
Huomiot |
access[key] |
O(n) |
O(1) |
n = kuvausten lukumäärä; hakee kunnes löytyy |
set[key] |
O(1) avg |
O(1) |
Asettaa ensimmäiseen kuvaukseen; pahimmillaan O(m), missä m = ensimmäisen kuvauksen koko |
del[key] |
O(1) avg |
O(1) |
Poistaa ensimmäisestä kuvauksesta; pahimmillaan O(m), missä m = ensimmäisen kuvauksen koko |
len() |
O(N) |
O(N) |
N = avainten kokonaismäärä kaikissa kuvauksissa; muodostaa sisäisesti joukkojen yhdisteen |
in |
O(n) |
O(1) |
Tarkistaa kaikki kuvaukset |
Käyttötapaukset
from collections import ChainMap
# Layer multiple dicts
defaults = {'timeout': 30, 'retries': 3}
user_config = {'timeout': 60}
config = ChainMap(user_config, defaults)
print(config['timeout']) # 60 (from user_config)
print(config['retries']) # 3 (from defaults)
# View layered configuration without merging
Suorituskyvyn vertailu
| Operaatio |
dict |
defaultdict |
Counter |
OrderedDict |
d[key] |
O(1) |
O(1) |
O(1) |
O(1) |
d[key] = value |
O(1) |
O(1) |
O(1) |
O(1) |
| Erikoismetodit |
- |
__missing__ |
most_common() |
move_to_end() |
| Muisti |
Perustaso |
+vähän |
+laskurien tallennus |
+järjestyksen seuranta |
UserDict
UserDict kietoo tavallisen sanakirjan luokkaan, jota käyttäjä voi mukauttaa.
Aikavaativuus
Sama kuin dict useimmissa operaatioissa:
| Operaatio |
Aika |
Tila |
Huomiot |
d[key] |
O(1) avg |
O(1) |
Pahimmillaan O(n) tiivistetörmäysten vuoksi |
d[key] = value |
O(1) avg |
O(1) |
Pahimmillaan O(n) |
del d[key] |
O(1) avg |
O(1) |
Pahimmillaan O(n) |
| Iterointi |
O(n) |
O(1) |
n = alkioiden lukumäärä |
UserList
UserList kietoo tavallisen listan luokkaan, jota käyttäjä voi mukauttaa.
Aikavaativuus
| Operaatio |
Aika |
Tila |
Huomiot |
| Indeksointi |
O(1) |
O(1) |
Haku indeksillä |
| Lisäys loppuun |
O(1) tasoitettu |
O(1) |
Pahimmillaan O(n) koon muuttuessa |
| Lisäys/poisto |
O(n) |
O(1) |
Siirtää alkioita |
| Iterointi |
O(n) |
O(1) |
n = listan pituus |
UserString
UserString kietoo tavallisen merkkijonon luokkaan, jota käyttäjä voi mukauttaa.
Aikavaativuus
| Operaatio |
Aika |
Tila |
Huomiot |
| Indeksointi |
O(1) |
O(1) |
Haku indeksillä |
| Yhdistäminen |
O(n) |
O(n) |
n = kokonaispituus |
| Viipalointi |
O(k) |
O(k) |
k = viipaleen pituus |
| Iterointi |
O(n) |
O(1) |
n = pituus |
Liittyvä dokumentaatio