Re: [python] Spojovani retezcu: (bylo: Rekurzivní generátor v Pythonu 3?)
On 08/28/2016 05:51 PM, Honza Král wrote: Honza Král E-Mail: honza.k...@gmail.com Phone: +420 606 678585 2016-08-28 17:40 GMT+02:00 Petr Messner : Díky Honzo za odkaz. Jinak - Python, Ruby, Java, C++, na jazyku nezáleží... Musím vědět, jestli daná operace manipuluje s některým svým operandem, nebo vytváří novou hodnotu. A protože jsou stringy v Pythonu immutable, tak jako programátor bych měl tušit, že se bude kopírovat. A dát si pozor na případy, kdy se bude kopírovat furt dokola. Že to pypy nějak umí optimalizovat je hezké, ale i kdybych ho používal, tak fakt není dobré spoléhat se na to, že mi překladač opraví chybu v samotném návrhu algoritmu. stale plati, ze mnohem dulezitejsi nez kompilator je programator - pouzivam tak to, co dava z hlediska kodu (nikoli kompilatoru nejvetsi smysl). Python s tim pocita a je na to zarizeny. Snazit se o takove optimalizace vetsinou prinasi vice problemu nez uzitku. A to i kdyz odhledneme od problemu spojenych s tim, ze python ma nekolik implementaci ktere se chovaji jinak. Zrovna tohle je v dokumentaci [0], takže tady je jasné jak se implementace budou (v nejhorším případě) chovat. Když chci algoritmus navrhout pořádně, je opravdu dobré na tohle vzít ohled. Nebo se teda dá spolehnout buď na to, že můj program, resp. programy co používají moji knihovnu, pojede jenom na CPythonu nebo PyPy, kde je tohle v určitých případech optimalizované, nebo že na to, že budou zpracovávat tak málo dat že kvadratická náročnost nebude hrát roli. [0] https://docs.python.org/3/library/stdtypes.html#common-sequence-operations - poznámka (6) ___ Python mailing list python@py.cz http://www.py.cz/mailman/listinfo/python Visit: http://www.py.cz
Re: [python] Spojovani retezcu: (bylo: Rekurzivní generátor v Pythonu 3?)
Honza Král E-Mail: honza.k...@gmail.com Phone: +420 606 678585 2016-08-28 17:40 GMT+02:00 Petr Messner : > Díky Honzo za odkaz. > > Jinak - Python, Ruby, Java, C++, na jazyku nezáleží... Musím vědět, jestli > daná operace manipuluje s některým svým operandem, nebo vytváří novou > hodnotu. A protože jsou stringy v Pythonu immutable, tak jako programátor > bych měl tušit, že se bude kopírovat. A dát si pozor na případy, kdy se bude > kopírovat furt dokola. > > Že to pypy nějak umí optimalizovat je hezké, ale i kdybych ho používal, tak > fakt není dobré spoléhat se na to, že mi překladač opraví chybu v samotném > návrhu algoritmu. stale plati, ze mnohem dulezitejsi nez kompilator je programator - pouzivam tak to, co dava z hlediska kodu (nikoli kompilatoru nejvetsi smysl). Python s tim pocita a je na to zarizeny. Snazit se o takove optimalizace vetsinou prinasi vice problemu nez uzitku. A to i kdyz odhledneme od problemu spojenych s tim, ze python ma nekolik implementaci ktere se chovaji jinak. > > Petr Messner > > 28. 8. 2016 v 17:04, Honza Král : > >> 2016-08-28 16:51 GMT+02:00 Jirka Vejrazka : >>> Jenom poznamka ne okraj: >>> >>> "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)." >>> >>> Tohle platilo nekdy do vydani Pythonu 2.5. V te verzi bylo spojovani retezcu >>> pomoci += vyrazne zrychleno a dnes uz to neni takove vykonove omezeni, jako >>> driv. >> >> Pokud je tech textu vice, .join() je stale lepsi, vice detailu: >> https://youtu.be/odjpaKL-Fsg?t=20m45s >> >>> >>> Ale je fakt, ze ''.join pouzivam ze zvyku taky :) >>> >>> Jirka >>> On 28 August 2016 at 13:52, Petr Messner wrote: co takhle tohle? a b c de f g h Oprava: a b c de f g h PM ___ Python mailing list python@py.cz http://www.py.cz/mailman/listinfo/python Visit: http://www.py.cz >>> >>> >>> >>> ___ >>> Python mailing list >>> python@py.cz >>> http://www.py.cz/mailman/listinfo/python >>> >>> Visit: http://www.py.cz >> ___ >> Python mailing list >> python@py.cz >> http://www.py.cz/mailman/listinfo/python >> >> Visit: http://www.py.cz > ___ > Python mailing list > python@py.cz > http://www.py.cz/mailman/listinfo/python > > Visit: http://www.py.cz ___ Python mailing list python@py.cz http://www.py.cz/mailman/listinfo/python Visit: http://www.py.cz
Re: [python] Spojovani retezcu: (bylo: Rekurzivní generátor v Pythonu 3?)
Díky Honzo za odkaz. Jinak - Python, Ruby, Java, C++, na jazyku nezáleží... Musím vědět, jestli daná operace manipuluje s některým svým operandem, nebo vytváří novou hodnotu. A protože jsou stringy v Pythonu immutable, tak jako programátor bych měl tušit, že se bude kopírovat. A dát si pozor na případy, kdy se bude kopírovat furt dokola. Že to pypy nějak umí optimalizovat je hezké, ale i kdybych ho používal, tak fakt není dobré spoléhat se na to, že mi překladač opraví chybu v samotném návrhu algoritmu. Petr Messner 28. 8. 2016 v 17:04, Honza Král : > 2016-08-28 16:51 GMT+02:00 Jirka Vejrazka : >> Jenom poznamka ne okraj: >> >> "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)." >> >> Tohle platilo nekdy do vydani Pythonu 2.5. V te verzi bylo spojovani retezcu >> pomoci += vyrazne zrychleno a dnes uz to neni takove vykonove omezeni, jako >> driv. > > Pokud je tech textu vice, .join() je stale lepsi, vice detailu: > https://youtu.be/odjpaKL-Fsg?t=20m45s > >> >> Ale je fakt, ze ''.join pouzivam ze zvyku taky :) >> >> Jirka >> >>> On 28 August 2016 at 13:52, Petr Messner wrote: >>> >>> >>> co takhle tohle? >>> >>> >>> a b c de f g h >>> >>> >>> Oprava: >>> >>> a b c de f g >>> h >>> >>> PM >>> >>> ___ >>> Python mailing list >>> python@py.cz >>> http://www.py.cz/mailman/listinfo/python >>> >>> Visit: http://www.py.cz >> >> >> >> ___ >> Python mailing list >> python@py.cz >> http://www.py.cz/mailman/listinfo/python >> >> Visit: http://www.py.cz > ___ > Python mailing list > python@py.cz > http://www.py.cz/mailman/listinfo/python > > Visit: http://www.py.cz ___ Python mailing list python@py.cz http://www.py.cz/mailman/listinfo/python Visit: http://www.py.cz
Re: [python] Spojovani retezcu: (bylo: Rekurzivní generátor v Pythonu 3?)
2016-08-28 16:51 GMT+02:00 Jirka Vejrazka : > Jenom poznamka ne okraj: > > "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)." > > Tohle platilo nekdy do vydani Pythonu 2.5. V te verzi bylo spojovani retezcu > pomoci += vyrazne zrychleno a dnes uz to neni takove vykonove omezeni, jako > driv. Pokud je tech textu vice, .join() je stale lepsi, vice detailu: https://youtu.be/odjpaKL-Fsg?t=20m45s > > Ale je fakt, ze ''.join pouzivam ze zvyku taky :) > > Jirka > > On 28 August 2016 at 13:52, Petr Messner wrote: >> >> >> co takhle tohle? >> >> >> a b c de f g h >> >> >> Oprava: >> >> a b c de f g >> h >> >> PM >> >> ___ >> Python mailing list >> python@py.cz >> http://www.py.cz/mailman/listinfo/python >> >> Visit: http://www.py.cz > > > > ___ > Python mailing list > python@py.cz > http://www.py.cz/mailman/listinfo/python > > Visit: http://www.py.cz ___ Python mailing list python@py.cz http://www.py.cz/mailman/listinfo/python Visit: http://www.py.cz
[python] Spojovani retezcu: (bylo: Rekurzivní generátor v Pythonu 3?)
Jenom poznamka ne okraj: "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)." Tohle platilo nekdy do vydani Pythonu 2.5. V te verzi bylo spojovani retezcu pomoci += vyrazne zrychleno a dnes uz to neni takove vykonove omezeni, jako driv. Ale je fakt, ze ''.join pouzivam ze zvyku taky :) Jirka On 28 August 2016 at 13:52, Petr Messner wrote: > > co takhle tohle? > > > a b c de f g h > > > Oprava: > > a b c de f g h > > PM > > ___ > Python mailing list > python@py.cz > http://www.py.cz/mailman/listinfo/python > > Visit: http://www.py.cz > ___ Python mailing list python@py.cz http://www.py.cz/mailman/listinfo/python Visit: http://www.py.cz
Re: [python] Rekurzivní generátor v Pythonu 3?
> co takhle tohle? > > a b c de f g h > Oprava: a b c de f g h PM___ Python mailing list python@py.cz http://www.py.cz/mailman/listinfo/python Visit: http://www.py.cz
Re: [python] Rekurzivní generátor v Pythonu 3?
> > V mém případě může část dokumentu vypadat třeba takto: > >text text > >textB textB textC textC textD textD Na tohle se vykašli. Jakmile dokument nemá stromovou strukturu, tak je vše tisíckrát složitější. Dikybohu toto XML neumí. Co je špatného na tom příkladě se sID/eID? Jestli je to v tom, že to neoznačuje i část obsahu/verše, co takhle tohle? a b c de f g h Na pochopení toho kódu bych si musel sednout někam v klidu, ale zatím jen taková drobnost - 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). Petr Messner 27. 8. 2016 v 23:09, Matěj Cepl : > Dobrý den, > > zkouším napsat v Pythonu 3.4+ nástroj pracující s milestonovanými XML soubory > (zdrojové texty překladu Bible). Podrobně jsem to popsal v blogpostu > https://matej.ceplovi.cz/blog/parsing-milestoned-xml-in-python.html, zde > jenom velice stručně. Milestones (milníky?) jsou metoda jak obejít > neschopnost XML pracovat s několika překrývajícími se hierarchiemi v jednom > souboru. Tak třeba právě v biblických textech (TEI se potýká s podobnými > problémy) je základní struktura kniha-kapitola-verš, ale přes to jsou další > elementy které se překrývají. Několik veršů (nebo jejich částí) jsou sdruženy > do logických oddílů (ale některé začínají v půli verše a často přesahují > hranice kapitol), nebo třeba zejména anglické biblické překlady mají v oblibě > značit výroky Pána Ježíše zvlášť (což pochopitelně často začíná a končí v > půli verše). > > Jedna z metod (používaná husta právě v biblických textech, TEI a podobných > složitě strukturovaných dokumentech) jsou právě milníky. Takže místo aby byl > text značen nějak takto: > > > > text > ... > > ... > > > použijí se na hranici knihy, kapitoly i verše milníky takto (buď se zvláštním > označením konce veršů nebo taky ne): > > > > text of verse 1.1 > > > > V mém případě může část dokumentu vypadat třeba takto: > >text text > >textB textB textC textC textD textD > > A chtěl bych aby moje knihovna naparsovala toto XML a vyprodukovala takovýto > seznam: > >[(1, 1, "text text", ['text text']), > (1, 2, "textB textB textC textC", > ['', 'textB textB', '', 'textC textC']), > (1, 3, "textD textD", ['', 'textD textD', ''])] > > (první dvě čísla jsou číslo kapitoly a verše, poslední položka tuplu je > seznam kousků XML v podobě přijatelné pro ElementTree.fromstringlist). Takže > představoval bych si generátor, který by byl schopen takovéto API: > >if __name__ == '__main__': >xml_file = ET.parse('tests/data/Mat-old.xml') >parser = ET.XMLParser(target=ET.TreeBuilder()) > >with open('test.txt', 'w', newline='\r\n') as out_txt, \ >open('test.xml', 'w', newline='\r\n') as out_xml: >for ch, v, verse_txt, verse_xml in recursive_parse(xml_file): >print(verse_txt, file=out_txt) ># or directly parser.feed(verse_xml) ># if verse_xml is not a list >parser.feed(''.join(verse_xml)) > >print(ET.tostring(parser.close(), encoding='unicode'), > file=out_xml) > > Po různých peripetiích (popsaných v tom zmiňovaném blogpostu) jsem v > současném okamžiku u tohoto (zatím bez shromažďování XML kousků): > >def __iter__(self) -> Tuple[CollectedInfo, str]: >""" >iterate through the first level elements >""" >cur_chapter = 0 >cur_verse = 0 >collected_txt = '' ># collected XML is NOT directly convertable into Element objects, ># it should be treated more like a list of SAX-like events. ># ># xml.etree.ElementTree.fromstringlist(sequence, parser=None) ># Parses an XML document from a sequence of string fragments. ># sequence is a list or other sequence containing XML data fragments. ># parser is an optional parser instance. If not given, the standard ># XMLParser parser is used. Returns an Element instance. ># ># sequence = ["", "text"] ># element = ET.fromstringlist(sequence) ># self.assertEqual(ET.tostring(element), ># b'text') > >for child in self.root.iter(): >if child.tag in ['titulek']: >collected_txt += '\n{}\n'.format(child.text) >collected_txt += child.tail or '' >if child.tag in ['kap', 'vers']: >if collected_txt and collected_txt.strip(): >yield CollectedInfo(cur_chapter, cur_verse, >re.sub(r'[\s\n]+', ' ', collected_txt, > flags=re.DOTALL).strip()), \ >child.tail or '' > >if child.tag == 'kap': >cur_chapt