přihlásit 6187/530231

Výkon jazyka Python

Dynmické interpretované jazyky jako Python jsou pomalejší, než jazyky statické a kompilované do instrukcí procesoru. U některých operací řádově. To je fakt s kterým je nutno počítat. Ale není to tak horké, jak by se mohlo zdát, zkusím zde vysvětlit proč.

Před tím se ale ještě musím vypořádat s tvrzením, že Python je pomalý i mezi dynamickými interpretovanými jazyky. Nevím kdy a jak toto tvrzení vzniklo, zřejmě to kdysi byla pravda a takové pověsti se člověk, vlastně jazyk, zbavuje obtížně.

Dnes (2005) to určitě není pravda. Python je jedním z nejrychlejších jazyků své kategorie. Konkurovat mu může Perl, kde v různých testech podávají vyrovnané výsledky, tu je o chlup lepší Python, tu Perl. Oblíbený jazyk PHP je 3 až 5 krát pomalejší než Python. Jazyky TCL nebo Ruby jsou rovněž výrazněji pomalejší.

Korunu tomu nasazuje pythoní knihovna Psyco. Tato knihovna dokazuje, že i kód nestatického jazyka lze optimalizovat na výkon. A skoro nic to nestojí, občas mírně zvýšené paměťové nároky. Použití knihovny Psyco je přitom velmi jednoduché. Stačí na začátek kódu vložit dva příkazy:

import psyco
psyco.full()

S jejím použitím je řada operací vykonána až neuvěřitelně rychleji. Například cykly, nebo práce s čísly. Malá ukázka:

import psyco
#psyco.full()
from time import time

def testCyclePass(cyklu):
    t1 = time()
    for i in xrange(cyklu):
        pass
    return time()-t1

def testCycleInt(cyklu):
    t1 = time()
    count = 0
    for i in xrange(cyklu):
        count = count+1
    return time()-t1, count

cyklu = 100000000

print 'PASS: ', testCyclePass(cyklu)
print 'INT:  ', testCycleInt(cyklu)

Jedná se o dva testy cyklů. První cyklus je prázdný, nic se během něj neděje. V druhém cyklu se během každého průchodu zvětší proměnná count o 1. Počet průběhů cyklu je 100 000 000.

Bez Psyco jsou časy 7,52 s a 21,5 s.
S Psyco jsou časy 0,11 s a 0,16 s.

S knihovnou Psyco nechává Python dynamické interpretované jazyky daleko za sebou. V tomto konkrétním testu se může měřit i s jazyky jako je C nebo Java. To už bohužel neplatí například o sčítání desetinných čísel (práce s datovým typem float), které Psyco tak dobře zrychlit neumí. U nich test dává výsledek 3,89 s.

Psyco není vše řešící. Zrychluje pouze některé operace. Šel by vymyslet příklad, kde zrychlení nebude znatelné. Průměrné zrychlení programu se uvádí čtyřnásobné. Dále je potřeba počítat s tím, že Psyco je použitelné jen na architektuře x86 (Pentium, AMD a spol), tedy na procesorech, na kterých běží Windows. Na procesorech sparc, power pc, arm a pod. nám nepomůže. Další omezení Psyco je, že pracuje se stackem a nelze jím optimalizovat programy, které rovněž pracují se stackem, to je sice výjimečné, ale je dobré to vědět.

Určitě nechci nikomu nutit myšlenku, že Python je rychlý jako jazyk C. Není. Jen chci upozornit, že není tak pomalý, jak by se mohlo zdát a jak někteří soudí.

I kdyby byl tak pomalý, nevadilo by to. Je tu totiž ještě jeden, významnější, fakt. Jazyk Python je navržen pro snadnou spolupráci s jazykem C a to jak pro embeding, tak pro extending. Embeding, neboli vložení, znamená použití Pythonu v C programu. Například OpenOffice.org lze skriptovat pomocí Pythonu, tj. v Pythonu lze psát makra a rozšíření pro OpenOffice.org. Extending, neboli rozšíření, znamená, že Python lze snadno rozšiřovat pomocí jazyka C.

Řada jeho knihoven je v jazyku C napsaná. Obvykle jsou knihovny pro Python jen bindingy na obecně používané knihovny napsané v jazyce C. Tyto knihovny jsou rychlé tak, jak to odpovídá programu napsaném v jazyce C a Python je pouze používá. Tedy zadá relativně pomalu příkaz udělej tohle a pak se to rychle provede.

Ale je možný i opačný přístup. Tedy nejen že v Pythonu využijeme obecnou C knihovnu, ale že si pro Python napíšeme vlastní C knihovnu z důvodu optimalizace. Každý kdo trochu programuje ví, že výkonově kritické jsou jen malé části kódu. Jsou-li tyto části kódu implementovány v jazyce C jako knihovny, může být zbytek programu klidně v Pythonu. Získáme tím výkon C programu a snadnost a efektivnost vývoje v Pythonu.

Například Python se zcela určitě nehodí na to, abychom v něm psali kód (de)komprimující video, to je vhodná úloha pro jazyk C. V Pythonu ale už klidně můžeme napsat videopřehravač, který používá knihovny dekomprimující video a bude to jednodušší, než ho psát v čemkoli jiném. A co si budeme povídat, většina programátorů stejně (de)komprimaci videa napsat neumí a raději použije nějakou existující knihovnu.

Má to ještě jeden aspekt. Ve většině případů knihovnu můžeme rychle a pohodlně napsat v Pythonu při vývoji programu. Kód v Pythonu je flexibilní a se snadno upravuje, takže je možno jej snadno přizpůsobovat podle různých aktuálních potřeb a zjištěných nedostatků. Že je to pomalejší nevadí, optimalizace kódu se stejně dělají až na samý závěr. Když máme aplikaci hotovou, api a protokoly jsou již stabilní a kompletní, můžeme zjistit, že pro reálný provoz potřebujeme vyšší výkon. Potom takovou knihovnu přepíšeme v jazyce C. To je vcelku běžná praxe a nazývá se to prototypování. Při použití vhodného jazyka prototypování zjednodušuje a zkracuje čas vývoje a tím ho dělá levnější. Nemusíme psát jen prototyp knihovny, ale třeba i celého programu. Python je jazyk vhodný na psaní prototypů.

Další řešení je, že místo přepisování programu nebo jeho části do C radši pořídíme výkonnější hardware. Třeba v případě speciálního software, který poběží jen na jednom počítači. Může se to zdát podivně, ale cena hardware je nízká a stále nižší, kdežto cena programátora vysoká a stále vyšší. Jazyk který výrazně zkrátí čas vývoje programu se tak může vyplatit i za cenu větších nároků na hardware.

Není to nic překvapivého, je to dlouhodobý trend už od prvopočátků programování. Cestu strojový kód, Asembler, C, Java, C#, Python charakterizuje zvyšující se produktivita programování a snižující se výkon aplikací. Python není první interpretovaný dynamický jazyk, ale jako první je navržen podobně jako systémové jazyky a tak vhodný k psaní rozsáhlejšího software. Největší problém v tomto směru má Python právě s nedůvěrou a předsudky programátorů, protože trochu předběhl svou dobu.

Python je vyšší jazyk než Java a obecně je pomalejší než Java. Ale díky běžně používaným knihovnám v C (třeba pro GUI) jsou praktické výsledky jiné. Jak známo, Java je 'proslavena' svým pomalým GUI a řada uživatelů proto Java aplikace odmítá. Aplikace napsaná v Pythonu díky GUI knihovně napsané v C má GUI mnohem rychlejší, uživatel nepozná žádný rozdíl a proto aplikace napsané v Pythonu neodmítá, vlastně ani často neví, že je v Pythonu napsaná, z venku to nejde poznat.

Jestli jste od této stránky očekávali nějaké benchmarky, tak teď musíte být zklamaní. Nezoufejte, dám vám odkaz na stránky, kde proti sobě na férovku nastoupila spousta jazyků a kde můžete navzájem porovnat libovolné dva jazyky i Python s a bez Psyco.

Benchmark Python vs. Python/Psyco [1] - možno zadat i jiné jazyky.


Seznam URL na stránce:
[1] http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=python&lang2=psyco&sort=fullcpu