Re: [python] Spojovani retezcu: (bylo: Rekurzivní generátor v Pythonu 3?)

2016-08-28 Tema obsahu Petr Viktorin

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?)

2016-08-28 Tema obsahu Honza Král
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?)

2016-08-28 Tema obsahu 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.

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 Tema obsahu 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] Spojovani retezcu: (bylo: Rekurzivní generátor v Pythonu 3?)

2016-08-28 Tema obsahu 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.

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?

2016-08-28 Tema obsahu Petr Messner

> 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?

2016-08-28 Tema obsahu Petr Messner
> 
> 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