[python] Rekurzivní generátor v Pythonu 3?

Matěj Cepl mcepl na cepl.eu
Pátek Březen 31 13:34:23 CEST 2017


On 2016-08-28, 10:54 GMT, Petr Messner wrote:
> Na tohle se vykašli. Jakmile dokument nemá stromovou 
> strukturu, tak je vše tisíckrát složitější. Dikybohu toto XML 
> neumí. 

Tohle je rada s odpuštěním na h... Ten vstupní datový formát mám 
daný, s tím nemůžu nic dělat.

> nedělej skládání řetězců stylem txt += part, je to strašně 
> pomalé (O(n^2) místo O(n))..  Z txt si udělej list a používej 
> append: txt.append(part) a na konci "".join(txt).

To je veselé jak tyhle pověry drží. Tohle bylo opraveno 
v pythonu 2.5 (pokud se nemýlím).

    ~$ cat test_plus.py
    out = ''
    for i in range(10000000):
        out += 'Nebudu komentovat rychlost algoritmů bez měření'
    ~$ python3 -mcProfile test_plus.py 
             3 function calls in 1.970 seconds

       Ordered by: standard name

       ncalls  tottime  percall  cumtime  percall filename:lineno(function)
            1    1.970    1.970    1.970    1.970 test_plus.py:1(<module>)
            1    0.000    0.000    1.970    1.970 {built-in method exec}
            1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}


    ~$ cat test_append.py
    out = []
    for i in range(10000000):
        out.append('Nebudu komentovat rychlost algoritmů bez měření')
    outstr = ''.join(out)
    ~$ python3 -mcProfile test_append.py 
             10000004 function calls in 3.331 seconds

       Ordered by: standard name

       ncalls  tottime  percall  cumtime  percall filename:lineno(function)
            1    1.845    1.845    3.331    3.331 test_append.py:1(<module>)
            1    0.000    0.000    3.331    3.331 {built-in method exec}
     10000000    0.528    0.000    0.528    0.000 {method 'append' of 'list' objects}
            1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
            1    0.959    0.959    0.959    0.959 {method 'join' of 'str' objects}

    ~$ 

Hezký den,

Matěj

-- 
https://matej.ceplovi.cz/blog/, Jabber: mcepl na ceplovi.cz
GPG Finger: 3C76 A027 CA45 AD70 98B5  BC1D 7920 5802 880B C9D8
 
You either die a hero or you live long enough to see yourself become the villain.
  -- Harvey Dent in The Dark Knight


Další informace o konferenci Python