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

Petr Messner petr.messner na gmail.com
Úterý Srpen 30 12:28:30 CEST 2016


To je veselé, když někdo dělá benchmark profilerem.

$ cat test_plus.py
out = ''
for i in range(10000000):
    out += 'Nebudu komentovat rychlost algoritmů bez měření'
$ cat test_append.py
out = []
for i in range(10000000):
    out.append('Nebudu komentovat rychlost algoritmů bez měření')
outstr = ''.join(out)
$ time python3 test_plus.py

real 0m2.835s
user 0m2.536s
sys 0m0.288s
$ time python3 test_append.py

real 0m1.848s
user 0m1.588s
sys 0m0.256s



Dne 30. srpna 2016 11:39 Matěj Cepl <mcepl na cepl.eu> napsal(a):

> 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
> _______________________________________________
> Python mailing list
> python na py.cz
> http://www.py.cz/mailman/listinfo/python
>
> Visit: http://www.py.cz
>
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://www.py.cz/pipermail/python/attachments/20160830/1620cd9a/attachment.html>


Další informace o konferenci Python