[Tutor PyCZ] zřetězení stringů

Pavel Kosina geon na post.cz
Středa Červen 21 11:31:09 CEST 2006


Bohumil Douša napsal(a):
> Tak jsem odpověď dostal na stránkách www.py.cz:
>
> "Pythonovské řetězce jsou totiž neměnné (immutable, narozdíl od 
> pascalovských). V každém cyklu se musí vytvořit nový řetězec (a starý 
> se zahazuje). To může vést k neočekávanému poklesu rychlosti 
> provádění. Spojování řetězců pomocí operátorů + nebo += je při 
> provádění několika změn v pořádku, ale při použití v cyklu se to 
> nedoporučuje."
>
toto pravděpodobně platilo v dřívějších verzích Pythona. Nyní to již 
není pravda, alespoň pokud se cyklus opakuje méně než 1.000.000 x. Buď 
lepší implementací nebo většími pamětmi u dnešních strojů...

import timeit

a="""   
    s = ""
    for i in range(1000000):
        s = s + "a"
        """
           
b="""
    z = []
    for i in range(1000000):
        z.append("a")
    ''.join(z)
    """
   
x=timeit.Timer(a)
print x.timeit(1)

x=timeit.Timer(b)
print x.timeit(1)

Výsledek:
0.835770188669
0.742270595844
 >>>

U 10-ti milionu opakování je již situace jiná, tam dostávám:
56.6808538515
8.99465686281
 >>>


> Bohumil Douša napsal(a):
>> Dobrý den,
>> začínám s pythonem a právě jsem si v jedné knize přečetl, že se nemá 
>> pro zřetězení používat znaménko "+", protože prý vytváří při každém 
>> použití nový objekt a že je lépe použít funkci z modulu string 
>> "string.join".
>> Jako příklad použití "+" je uvedeno(toto prý vytvoří dva objekty):
>> x = "ahoj " + "svete"
>>
tento způsob zápisu je pro začátečníka, pro čitelnost a srozumitelnost, 
daleko vhodnější. Doporučuji zůstávat u tohoto, pokud se jedná prosté 
slučování řetězců.



-- 
geon
Pavel Kosina

------------- další část ---------------
HTML příloha byla odstraněna...
URL: http://www.py.cz/pipermail/tutor/attachments/20060621/de29f5b1/attachment.htm 


Další informace o konferenci Tutor