Rendezéshez a sorted() függvényt vagy a list.sort() metódust használjuk?

A válasz, mint ahogy sok esetben, most is az, hogy attól függ. Ugyanis a sorted() beépített függvény egy iterálható objektumot fogad és a rendezett elemeket egy listában adja vissza. Ha az argumentumként átadott iterálható objektum konténer, akkor az a sorted() hívása után változatlan marad. Ha a rendezni kívánt elemek egy listában (list típusú konténerben) vannak, vagy egy iterálható objektumból listában gyűjtjük össze azokat, akkor a rendezést a lista sort() metódusával is elvégezhetjük. Ilyenkor a rendezés helyben (in-place) történik, ami azt jelenti, hogy – ellentétben a sorted() függvény használatával – az eredeti elemsorrend a rendezés után nem áll rendelkezésre (kivéve persze, ha a sort() metódus hívása előtt a lista elemeit egy másik sorozat típusú konténerbe nem „mentjük”)

Tehát a választás első szempontja, hogy szükséges-e, hogy a rendezetlen elemsorozat megmaradjon. Ha igen, akkor célszerű a sorted() választása.

Másik szempont a memóriaigény. A sorted(), mivel az eredeti adatsorozat is megmarad és létrejön egy új rendezett lista, nyilván több memóriát igényel, mint a helyben rendezett lista.

És végül az is fontos lehet, hogy futási időben hogy teljesít a két módszer.

Ennek vizsgálatához az alább látható három függvényt készítettük. Az első egy iterálható objektumot fogad, és ennek elemeit a sorted() függvény segítségével rendezi. A második szintén egy tetszőleges iterálható objektumot fogad, de utána ebből egy listát állít elő, amit a sort() metódussal rendez. Az előbbiektől eltérően a harmadik függvénynek egy listát kell átadni, amelynek elemei közvetlenül, helyben lesznek rendezve a sort() metódus meghívása után.

A futási időt a timeit modul timeit függvényével mérjük a három függvény meghívásával egyre növekvő rendezendő elemszámok esetén. A kapott eredmények alapján jól látható, hogy a sorted() függvény használatával nem jelentősen, de mégis kicsit hosszabb futási idő adódik mint, amikor az iterálható objektum elemeit listába helyezzük és e listát rendezzük helyben a sort() metódussal. Ha azonban a rendezendő adatok eleve egy listában állnak elő és ezt rendezzük helyben, akkor nagyon jelentős futási idő csökkenést érhetünk el a sorted() alkalmazásához képest.

Ez, valamint a kevesebb memóriaigény az oka annak, hogy az előző „Nagyméretű adathalmazok rendezése” című bejegyzésben a rendezni kívánt fájlból beolvasott, meghatározott hosszúságú szakaszokat (chunk_list) a sort() metódussal helyben rendezzük, mert a beolvasott adatok rögtön egy listában állnak elő és e lista eredeti elemsorrendjére később nincs szükség.

A Python tudásépítés lépésről lépésre című e-könyvben a sorted() függvény ismertetése a „Beépített függvények” fejezetben található. A lista sort() metódusáról a „Beépített típusok nyilvános metódusai” fejezetben van szó. A timeit modulról és a timeit függvény használatáról pedig részletesen a „Készétel fogyasztás – a szabványos könyvtár moduljainak használata” fejezet „A programvégrehajtás felfüggesztése és a futási idő mérése” alfejezetben lehet olvasni.

Érdekel a Python tudásépítés lépésről lépésre az alapoktól az első asztali alkalmazásig című e-könyv.