abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
dnes 14:22 | Zajímavý projekt

GitHub v příspěvku na svém blogu představil GitHub Sponsors. Jedná se o další z možností, jak finančně podpořit vývojáře open source softwaru. Podrobnosti v často kladených dotazech (FAQ).

Ladislav Hagara | Komentářů: 8
dnes 13:44 | Zajímavý software

Společnost Feral Interactive zabývající se vydáváním počítačových her pro operační systémy macOS a Linux vydala počítačovou hru Total War: Three Kingdoms (Wikipedie) pro Linux. Koupit ji lze za 59,99 €. Tentokrát byla verze pro Linux vydána ve stejný den jako verze pro Microsoft Windows.

Ladislav Hagara | Komentářů: 0
dnes 10:00 | Nová verze

Po téměř 11 měsících vývoje od vydání verze 5.28 byla vydána nová stabilní verze 5.30 programovacího jazyka Perl. Do vývoje se zapojilo 58 vývojářů. Změněno bylo přibližně 620 tisíc řádků v 1 300 souborech. Přehled novinek a změn v podrobném seznamu.

Ladislav Hagara | Komentářů: 1
včera 16:44 | Nová verze

Bylo vydáno openSUSE Leap 15.1. Přehled novinek v nejnovější verzi této linuxové distribuce v oznámení o vydání a v poznámkách k vydání.

Ladislav Hagara | Komentářů: 0
včera 11:55 | Nová verze

Byla vydána verze 3.14 živé linuxové distribuce Tails (The Amnesic Incognito Live System), jež klade důraz na ochranu soukromí uživatelů a anonymitu. Přehled změn v příslušném seznamu. Tor Browser byl aktualizován na verzi 8.5. Řešeno je také několik bezpečnostních chyb. Především bezpečnostní chyby v procesorech Intel.

Ladislav Hagara | Komentářů: 1
včera 11:33 | Nová verze

Byla vydána nová verze 2019.2 průběžně aktualizované linuxové distribuce navržené pro digitální forenzní analýzu a penetrační testování Kali Linux (Wikipedie). Přehled novinek v seznamu změn. Současně byl ve verzi 2019.2 vydán také Kali Linux NetHunter (Wikipedie), tj. obrazy s nástroji z Kali Linuxu pro chytré telefony a tablety.

Ladislav Hagara | Komentářů: 0
včera 11:22 | Nová verze

Vyšel webový prohlížeč Tor Browser, založený na Firefoxu (60.7) a zaměřený na ochranu soukromí, ve verzi 8.5. Mění vzhled, zlepšuje přístupnost a nově je prohlášen za stabilní na Androidu.

Fluttershy, yay! | Komentářů: 0
21.5. 16:11 | Nová verze

Byl vydán Mozilla Firefox 67.0. Přehled novinek v poznámkách k vydání a na stránce věnované vývojářům. Zdůraznit lze blokování těžby kryptoměn a otisku prohlížeče, viditelnější účet Firefoxu nebo rychlý přístup ke správci hesel.

Ladislav Hagara | Komentářů: 7
21.5. 03:33 | Komunita

Rozšířená podpora operačního systémy Microsoft Windows 7 skončí 14. ledna 2020. Poté je možné využít placené podpory, přejít na Windows 10 nebo prostě na Linux. Vláda Jižní Koreje zkouší Linux. Přechod na Linux včetně nákupu nových počítačů by ji měl vyjít na 655 milionů dolarů.

Ladislav Hagara | Komentářů: 33
21.5. 02:22 | IT novinky

CZ.NIC ODVR (Otevřené DNSSEC Validující Resolvery) nově podporují vedle DNS-over-TLS (DoT) také DNS-over-HTTPS (DoH). DoH lze vyzkoušet ve Firefoxu od verze 62, Chrome od verze 66 nebo Bromite od verze 67.

Ladislav Hagara | Komentářů: 0
GPU kterého výrobce aktuálně preferujete pro provoz Linuxu?
 (49%)
 (25%)
 (24%)
 (2%)
Celkem 336 hlasů
 Komentářů: 28, poslední 21.5. 04:02
Rozcestník

Dotaz: Cyklus s více podmínkami; Python

17.3. 07:56 jsk | skóre: 10
Cyklus s více podmínkami; Python
Přečteno: 930×
Zdravím,

nemůžu se hnout z místa :-(, mám soubor mesice, ze kterého potřebuji vyrobit několik dalších souborů. Ty budou, ideálně, pojmenovány podle položek v souboru jmena (Karel, Luboš, Jindra, Rebecca) tak, že do každého z nových souborů potřebuji vložit pouze ty řádky, které obsahuji prvek ze souboru jmena. V jednom řádku je vždy nejvýše jeden prvek ze souboru jmena. Takže výsledkem by mělo být soubory Karel, Luboš, Jindra, Rebecca, pokud by se v souboru jméno nevyskytovalo, soubor by se nevytvořil. Líbilo by se mi mít to ve vlastní funkci se vstupem jmena a mesice. Jsem to sice schopen udělat postupně, pro každé jméno zvlášť, ale to je takové nemotorné, ta funkce by asi byla nejlepší.

Předem děkuji všem za rady a nasměrování.

Pepa

Řešení dotazu:


Odpovědi

17.3. 11:29 Roman
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Co takhle poslat co už máš, kde ses sekl, chybové hlášení, příklad dat,... Nechci kecat, ale podle posledních zpráv křišťálové koule došli.
17.3. 21:18 jsk | skóre: 10
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Přílohy:
Asi to tak bude, jak u nás přestal jezdit pojízdná prodejna, tak jsem křišťálové koule neviděl :-)

Přikládám zdrojové soubory a pak jednu z variant. Jako začátečník v Pythonu si dost dobře nedovedu představit jak podle slov v jednom souboru vyberu řádky z jiného souboru. V souboru jmena jsou vlastně vzory pro grep, ale ten použít nemohu, potřebuji, aby to běhalo i pod W10.

Zdraví Pepa
Řešení 1× (Andrej)
17.3. 18:12 Bherzet | skóre: 11 | blog: Bherzetův blog
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Otevřeš soubor jmena, čteš z něj položky, zapisuješ je do patřičných souborů.
17.3. 21:26 jsk | skóre: 10
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
To jsem se nejspíš špatně vyjádřil. Podle položek v jmena vyberu řádky ze souboru mesice , které obsahují danou položku. Ty uložím do souboru např. Karel.txt, kde Karel je vzor podle něhož se ze souboru mesice kopírovaly řádky. A tak dále pro všechny položky ve jmena. Nebo jsem to nepochopil já.

Díky Pepa
Řešení 1× (Bystroushaak)
17.3. 21:53 Bherzet | skóre: 11 | blog: Bherzetův blog
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
#!/usr/bin/env python3

def names(filename):
    with open(filename, "r") as fin:
        return set(line.strip() for line in fin.readlines() if len(line.strip()))

def aggregate(input_filename, keys):
    fouts = dict((k, None) for k in keys)

    with open(input_filename, "r") as fin:
        for line in fin:
            for key in keys:
                if key in line:
                    if not fouts[key]:
                        fouts[key] = open(key + ".txt", "w")
                    fouts[key].write(line + "\n")

    for fout in fouts.values():
        if fout:
            fout.close()

if __name__ == "__main__":
    aggregate("mesice.txt", names("jmena.txt"))

17.3. 23:05 jsk | skóre: 10
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Moc děkuji!! Budu se v tom muset zorientovat, kód obsahuje hodně věcí, které ještě neznám. Určitě se ještě ozvu.
Děkuje a zdraví
Pepa
Řešení 1× (Bystroushaak)
18.3. 00:05 Andrej | skóre: 46 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python

Tady je moje řešení, které čte všechno na jediný průchod (bez ohledu na počet vzorů) a má ošetření chybových stavů.

Pokud uživatel skript spustí špatně, pokud nepůjde otevřít některý ze vstupních souborů nebo pokud nepůjde otevřít některý z výstupních souborů (třeba proto, že existuje a je read-only), ohlásí skript chybu (místo ošklivého backtrace) a korektně zavře všechny soubory, které případně byly otevřené — což se hodí, chce-li někdo tento kód přetvořit v opakovaně volanou funkci.

#!/usr/bin/env python3

import sys
import re

if len(sys.argv) != 3:
  sys.exit(f'Usage: {sys.argv[0]} <names> <months>')

fds = {}
def maybe_open(name):
  output = fds.get(name)
  if output is None:
    output = open(name, 'w')
    fds[name] = output
  return output

try:
  with open(sys.argv[1], 'r') as names_file:
    names = tuple(line[:-1] for line in names_file)
  openers = {name: lambda name=name: maybe_open(name) for name in names}
  matcher = re.compile('|'.join(re.escape(name) for name in names))
  with open(sys.argv[2], 'r') as months_file:
    for line in months_file:
      for match in set(matcher.findall(line[:-1])):
        openers[match]().write(line)
except Exception as e:
  sys.exit(e)
finally:
  for fd in fds.values():
    fd.close()

Spouští se to například takto:

./jméno_skriptu.py jména.txt měsíce.txt
ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ
18.3. 00:34 Andrej | skóre: 46 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python

V očekávání davu křičícího, že soubory není třeba zavírat, protože jakmile příslušný slovník s referencemi na ně přijde o svou poslední referenci, vše se zlikviduje a zavře, dodávám raději předem následující:

Ve většině implementací Pythonu tomu tak šťastnou náhodou je, ale rozhodně ne ve všech, protože jazykový standard takové chování sice umožňuje, ale nezaručuje. Korektní a portovatelný kód by tedy měl mít buď with (...):, nebo close().

ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ
18.3. 16:32 jsk | skóre: 10
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Děkuji a skláním se!
Vidím, že řešení je mnohem náročnější než jsem si uměl představit a chvíli potrvá než kódu porozumím. Pokud se zadrhnu v chápání, dovolil bych si ještě položit otázku, díky.
Za kód a poučení děkuje
Pepa
18.3. 19:26 pete
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Super, lepsi nez ten predchozi skript, tohle psal zkuseny programator
18.3. 20:39 pedro
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Ano, blbe se to cte a je to cca 2x pomalejsi (a to jsem z toho pred testovanim vyrazil celkem zbytecne predavani argumentu z radky)...
18.3. 22:02 Andrej | skóre: 46 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python

Tihle anonymní žvanilové… Těch kdyby bylo na ABCLinuxu méně (nebo 0), opravdu by to hodně pomohlo.

Žvanění je laciné. Show us the code. Soudě podle siláckých řečí, lze od tvého — zatím tajného — kódu očekávat, že:

  • je prokazatelně (benchmark, prosím!) dvakrát rychlejší. Výborně. Jak přesně jsi to měřil?
  • má srovnatelnou exception safety a kontrolu vstupu.
  • se lépe čte, samozřejmě, jak jinak.

Když má někdo lepší řešení než předchozí, jistě se jím (místo prázdných keců) rád pochlubí. Takže? Kdepak je? Už se těším, na jakých krajních případech to řešení otestuju — hned jak ho uvidím.

Zbytečnost argumentů z příkazové řádky… Ehm… Už jsi někdy něco v praxi programoval? :-D Na to se nic jiného říct nedá.

ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ
18.3. 22:40 _
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Spíše než anonymní žvanil to bude ublížený Bherzet, vyžívá se v trollování. Neřešil bych :-)
19.3. 10:10 Bherzet | skóre: 11 | blog: Bherzetův blog
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Taky bych to s tebou mohl probrat osobně v Kohoutovicích.
19.3. 10:48 _
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
To bys mohl, ale já tam za tebou nepojedu
19.3. 11:25 Bherzet | skóre: 11 | blog: Bherzetův blog
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Nepojedu? Výtahem možná tak, ne?
19.3. 11:51 pedro
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Presne takovou reakci jsem cekal. Pobavilo. Kazdy si muze sam vyzkouset, ktery z tech dvou reseni je vykonnejsi, hint knihovna time.

Chapu, Andrej, ze to boli :-)
19.3. 12:16 Andrej | skóre: 46 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python

:-D Ale no tak, anonyme, tvoje vlastní hloupost tě musí bolet. Ty jsi žádné řešení neukázal, takže — kód, prosím. Nebo se můžeš přihlásit, naznačuješ-li, že jsi autorem předchozího pokusu.

Prý „vykonnější“. :-D Jako když páťák mluví o autech.

Koho by asi tak tankovalo, kdyby to „řešení“ výše, které má vždy lineární složitost v počtu jmen (fujtajbl!) a ani nepozavírá soubory, když u jednoho dojde k chybě, bylo rychlejší pro triviální případy? Třeba fracka, který nikdy nic nenaprogramoval? :-D Jo, toho by to možná zaujalo.

Každý si může sám vyzkoušet…? Ale ale ale. Takhle to na světě nechodí.

Takže, budou data nebo jenom další žvásty? Na kolika GB vstupních dat jsi to testoval? Klíčových slov ve vstupu jsi měl tisíc nebo milión? Jaké byly výsledky? S jakými konfidenčními intervaly?

Ach jo. ABCLinuxu, prosím, vyhoďte už ten anonymní póvl oknem ven.

ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ
Bystroushaak avatar 19.3. 12:22 Bystroushaak | skóre: 35 | blog: Bystroushaakův blog | Praha
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
a ani nepozavírá soubory, když u jednoho dojde k chybě, bylo rychlejší pro triviální případy?
Technická; Soubory se v pythonu zavřou automaticky na konci, i když to skončí chybou.
19.3. 12:32 Andrej | skóre: 46 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python

Technická: Ne vždycky. To jsem koneckonců uváděl i výše.

Samozřejmě, že soubory v UNIXu se automaticky zavřou, bez ohledu na to, proč proces odletí. Nicméně výše odkazovaný blog ukazuje příklady, kdy se nezapsal obsah bufferu v některých implementacích Pythonu.

Ve většině implementací Pythonu je to opravdu tak, že při ukončení s otevřenými soubory (ať už normálním nebo kvůli neošetřené výjimce) se všechno správně flushne. Ale neplatí to obecně a nelze na to jednoduše spoléhat.

(Kromě toho je obecně dobrým zvykem psát kód tak, aby se mohl stát knihovní funkcí, která se dá opakovaně volat a která po sobě nenechá nedefinovaný stav, ani v případě, že skončí výjimkou.)

ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ
Bystroushaak avatar 19.3. 12:48 Bystroushaak | skóre: 35 | blog: Bystroushaakův blog | Praha
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
(Kromě toho je obecně dobrým zvykem psát kód tak, aby se mohl stát knihovní funkcí, která se dá opakovaně volat a která po sobě nenechá nedefinovaný stav, ani v případě, že skončí výjimkou.)
Souhlasím, ale co má za smysl tohle řešit v kontextu téhle diskuze, kde máš globální proměnné které nakonci nečistíš, a když ten kód importuješ, tak se hned začne provádět, načítat data z sys.argv a tak.
19.3. 13:17 Andrej | skóre: 46 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python

Souhlasím, že celá tahle diskuse je na prd.

Globální proměnné v quick&dirty skriptu jsou v nejlepším pořádku a kdo z toho bude chtít knihovnu, ať si to celé zanoří do funkcí podle libosti.

ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ
Bystroushaak avatar 19.3. 12:50 Bystroushaak | skóre: 35 | blog: Bystroushaakův blog | Praha
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Ve většině implementací Pythonu je to opravdu tak, že při ukončení s otevřenými soubory (ať už normálním nebo kvůli neošetřené výjimce) se všechno správně flushne. Ale neplatí to obecně a nelze na to jednoduše spoléhat.
Jeden z případů, kde na to imho nelze spoléhat je například kill -9. Jenže tam nepomůže ani finally:. Řešení by udělat nad filesystémem transakci pomocí atomického move odněkud z /tmp, ale to už se dostáváme fakt do ezoterie úplně odtržené od reality původního dotazu.
19.3. 13:24 Andrej | skóre: 46 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python

Nejde přece o kill -9. Jde taky (kromě jiného) o to, že (jak uvádí výše odkazovaný blogpost), Jython a PyPy nezavírají automaticky soubory, když se ztratí poslední reference na ně, ale až při ukončení procesu.

Takže kdyby někdo například používal tento kód jako opakovaně volanou funkci, která by ale občas selhala, byl by to docela zajímavý leak a případně by mohl pozorovat nekonzistentní data, kdyby se mezitím (jinde v kódu) pokoušel vytvořené soubory číst.

Ano, tohle už je off-topic a vůbec jsem neměl v úmyslu na to tolik upozorňovat a/nebo to stavět do kontrastu s původním řešením. :-( Tohle je prostě jedna z těch situací, ve kterých by zákaz anonymů prospěl.

ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ
Bystroushaak avatar 19.3. 12:30 Bystroushaak | skóre: 35 | blog: Bystroushaakův blog | Praha
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Ach jo. ABCLinuxu, prosím, vyhoďte už ten anonymní póvl oknem ven.
Já moc nechápu, proč se do tohohle necháváš vůbec zatáhnout. Všechny řešení tady jsou nedotažené kludges, kde bych našel deset způsobů jak to rozbít tobě i Bherzetovi.
Takže, budou data nebo jenom další žvásty? Na kolika GB vstupních dat jsi to testoval? Klíčových slov ve vstupu jsi měl tisíc nebo milión? Jaké byly výsledky? S jakými konfidenčními intervaly?
Má nějaký smysl se hádat o tom kdo to vyřeši líp, když jste oba prostě chtěli pomoci OPovi a nikdo z vás nedodal kód co by byl fakt hodný do produkce? Co má za smysl řešit ošetření chyb v takovém quick&dirty kódu, když tam je kopa dalších zásadních nedostatků, jako používání globálních proměnných, nemožnost ten tvůj kód vůbec importovat, chybějící dokumentace, nevhodná dekompozice a tak podobně. Třeba tam ani netestuješ, jestli soubory existují, než je otevíráš proč čtení.

Tím nechci říct, že Bherzetův kód je nějak výrazně lepší, trpí ostatně podobnými problémy, ale proč proboha vytahovat tyhle blbosti v diskuzi kde se snažíte pomoci tazateli rychlou ukázkou jak na to.
19.3. 13:03 Andrej | skóre: 46 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Ach jo. ABCLinuxu, prosím, vyhoďte už ten anonymní póvl oknem ven.
Já moc nechápu, proč se do tohohle necháváš vůbec zatáhnout. Všechny řešení tady jsou nedotažené kludges, kde bych našel deset způsobů jak to rozbít tobě i Bherzetovi.

Výborně. Kód, prosím. Rád se poučím. :-)

Je snadné si povšimnout, že já jsem tuhle hloupou debatu nezačal; jen mám silnou a stále sílící alergii na místní anonymy.

Má nějaký smysl se hádat o tom kdo to vyřeši líp, když jste oba prostě chtěli pomoci OPovi a nikdo z vás nedodal kód co by byl fakt hodný do produkce?

Toto^^^ tvrzení je ovšem bez ukázky kódu … jak to jen slušně říct … poněkud plané. Stejně jako řeči o "produkci". OP chtěl nějaké řešení. Jak si ho upraví a kam si ho začlení, to už je na něm.

Co má za smysl řešit ošetření chyb v takovém quick&dirty kódu, když tam je kopa dalších zásadních nedostatků, jako používání globálních proměnných

V této větě si odporuješ. Na jedné straně to má být quick&dirty — ano, od ukázky kódu někde na fóru se nic jiného čekat nedá. Na druhé straně jsou zrovna tady globální proměnné problém?

V quick&dirty skriptu, který se nevolá z jiného kódu, mi globální proměnné připadají naprosto v pořádku, zatímco odlet na neošetřenou výjimku není v pořádku, pokud za sebou nechá nedefinovaný stav (otevřené soubory).

Kdyby někdo chtěl tohle použít jako knihovnu, asi tak za 2 minuty by to mohl celé "zahnízdit" do funkce (nebo do instance objektu, podle chuti, podle použití) a globálním proměnným se vyhnout.

, nemožnost ten tvůj kód vůbec importovat, chybějící dokumentace, nevhodná dekompozice a tak podobně.

:-D Takže, je to / má to být krátký a jednoduchý a názorný příklad nebo něco jiného?

Zmínka o dokumentaci je v tomto kontextu dost absurdní. Nejsem přece zaměstnancem OP, abych pro něj vytvářel kompletní knihovnu s dokumentací, testy atd. Sepsal jsem narychlo jednoduchý příklad, který splňuje zadání. Toť vše.

Třeba tam ani netestuješ, jestli soubory existují, než je otevíráš proč čtení.

Ale proč bych to dělal? Mám tam ošetření výjimek a neexistující soubor skončí výjimkou FileNotFoundError: [Errno 2] No such file or directory: ...

Tím nechci říct, že Bherzetův kód je nějak výrazně lepší, trpí ostatně podobnými problémy, ale proč proboha vytahovat tyhle blbosti v diskuzi kde se snažíte pomoci tazateli rychlou ukázkou jak na to.

Můj kód je jistě sračka; to bezesporu. Je to rychlá a jednoduchá ukázka určená k základnímu předvedení, jak by se problém tazatele dal případně řešit. Neklade si za cíl být "produkční", "konzumační" ani jiný.

Znova podotýkám: Nejsem to já, kdo zahájil tuhle hloupou, pseudo-anonymní a ničím nepodloženou debatu.

ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ
Bystroushaak avatar 19.3. 13:39 Bystroushaak | skóre: 35 | blog: Bystroushaakův blog | Praha
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Je snadné si povšimnout, že já jsem tuhle hloupou debatu nezačal; jen mám silnou a stále sílící alergii na místní anonymy.
Chápu no. Mám to do jisté míry podobně.
:-D Takže, je to / má to být krátký a jednoduchý a názorný příklad nebo něco jiného?
Já bych byl spíš za ten krátký a jednoduchý, například je docela jedno že to padne. Prostě smázneš soubory a pustíš to upravené znova.
Znova podotýkám: Nejsem to já, kdo zahájil tuhle hloupou, pseudo-anonymní a ničím nepodloženou debatu.
Ok. Beru. Jen jsem spíš chtěl podotknout že nemá smysl se do ní zatahovat a proč, ale teď zpětně vidím, že tím jsme se jen zatáhli víc oba. Za to se omlouvám.

Za mě super že jsi poslal svoje řešení, to bylo konstruktivní.
19.3. 12:46 pedro
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Testovwl jsem to na zadani, ktery jsem dostal,ty gigabajte :-) A davej si bacha,jaka volis slova vuci druhym.
19.3. 12:51 _
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Přesně, do Curychu je to coby kamenem (kohoutem?) dohodil xD
19.3. 13:08 Andrej | skóre: 46 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python

Ale no tak, anonyme, ty ses nějak rozdurdil. No podívejme. Mám si dávat bacha — nebo jinak co? :-D

Já nic testovat nemusím, protože nejsem autorem testovaného výroku. Znova si přečti, v čem spočívá problém tvé argumentace: Burden of Proof Fallacy A zkus to tentokrát pochopit.

Když přicházíš do debaty s nějakým tvrzením, důkazní břemeno je na tvé straně. Debata nefunguje tak, že řekneš: Já říkám tohle a vy ostatní to zkuste vyvrátit, protože jinak mám pravdu já.

ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ
19.3. 13:47 Andrej | skóre: 46 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python

Ještě "technická" pro úplnost, burden of proof stranou:

Úsměvné na tom je, že pro počet jmen, který se dá spočítat na prstech, a pro relativně malá vstupní data máš (s pravděpodobností hraničící s jistotou) pravdu.

Pro milión "jmen" to ale dopadne úplně jinak, protože moje řešení nebude každou řádku testovat miliónkrát, ale projde ji jen jednou.

(Snad jsem to konečně vysvětlil dostatečně polopatě a po lopatě.)

Problém je, když tvrdíš cosi o "výkonnosti" u dat tak malých, že se dají napsat na papír, a navíc ještě nesmyslně konfrontačním tónem. Vykládat, že něco, co trvá milisekundu, je dvakrát rychlejší něž něco podobného, nemá smysl.

ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ
19.3. 18:09 pedro
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Ale to v zadani neni.
19.3. 22:13 Andrej | skóre: 46 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python

Ale to neznamená, že řešení, které je náhodou na malinkých datech o milisekundu rychlejší, je "výkonnější".

ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ
19.3. 14:33 Bherzet | skóre: 11 | blog: Bherzetův blog
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Nebo se můžeš přihlásit, naznačuješ-li, že jsi autorem předchozího pokusu.
Andreji, pochop, prosím, že mám trolla, který nemá na práci nic lepšího než každý den v 11 dopoledne přijít na Abclinuxu, přidat pár štítků na blogy či jinam a poslat pár komentářů. Teď se právě dobře baví, že se mu podařilo diskuzi zbytečně rozhádat. Existuje přitom jednoduché řešení: Nekrmit. Reagovat jen na seriózní komentáře. V případě pochyb se řídíme identitou. Ta u neregistrovaných uživatelů chybí.
lineární složitost v počtu jmen (fujtajbl!)
Ano, jde to udělat líp: Naparsovat ze řádku jméno a ověřit, že se nachází v setu hledaných jmen. A nebo jako to děláš ty tou FSM, ta to také matchne na jediný průchod. Ale to, stejně jako moje řešení, selhává na případné kolizi s jinými sloupci. Zde by bylo potřeba upřesnit zadání.

Já vycházel z předpokladu, že jmen bude málo. Působí to na mě totiž dojmem, že skript je určen na v podstatě prohledávání jakýchsi objemnějších dat. Kdyby jmen bylo hodně, asi by neexistoval ani žádný soubor jmena.txt, resp. by jej někdo musel generovat. Pak by asi nevznikla ani takto zadaná úloha. Spíš by už existoval skript, který udělá kompletní agregaci jmen ze souboru mesice.txt.

Proto jsem upřednostnil jednoduchost. Přiznávám nicméně, že řešení s FSM mě ani nenapadlo a přijde mi dobré.
ani nepozavírá soubory, když u jednoho dojde k chybě
To mi přišlo úplně zbytečné u takovéto úlohy řešit, protože reálně by k tomu došlo asi tak jedině při vyčerpání volného místa na disku. Ale jinak máš samozřejmě pravdu.

ad rychlost) Na dodaných datech jsou obě naše řešení stejně rychlá (tři spuštění, rozdíl mezi nimi ± 1 ms; vzal jsem střední hodnotu):
$ time ./Andrej.py jmena.txt mesice.txt 

real	0m0.037s
user	0m0.030s
sys	0m0.007s

$ time ./prasarnicka.py 

real	0m0.029s
user	0m0.022s
sys	0m0.007s

$ python3 --version
Python 3.6.7
To ale nemá smysl řešit. Jak jsme si vyjasnili, oba kódy se liší po funkční stránce věci (a ano, tvůj kód je korektnější). S rostoucím počtem jmen by navíc moje řešení bylo výrazně pomalější.

Jinak tvůj kód je pro mě na hranici čitelnosti, ale to je dílem záležitost coding-stylu, dílem toho, že to pravděpodobně nebylo tvojí prioritou (stejně jako nebylo mou prioritou ošetřit všechny chybové stavy, implementovat CLI apod.).
19.3. 14:41 pedro
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
19.3. 14:59 Andrej | skóre: 46 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python

Díky za reakci.

Tím je tedy vyvrácena také spekulace anonyma „podtržítko“.

Máš pravdu — nekrmit je nejlepší varianta. Dlužno taky dodat, že jsem neměl vůbec v úmyslu nějak kritizovat tvůj kód.

Uf. Taková zbytečná a únavná debata kvůli pár anonymním kecům. :-D

ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ
19.3. 15:06 Bherzet | skóre: 11 | blog: Bherzetův blog
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Jen BTW, pete, pedro a _ jsou jeden člověk (jestli ho tak můžeš nazývat).
19.3. 15:24 Andrej | skóre: 46 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python

Což mi bohužel docvaklo až teď.

ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ
19.3. 15:38 Bherzet | skóre: 11 | blog: Bherzetův blog
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
V pohodě, stane se. :)
Bystroushaak avatar 19.3. 15:57 Bystroushaak | skóre: 35 | blog: Bystroushaakův blog | Praha
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Jaký to je pocit mít osobního trolla? Mi to tu Jenda pořád záviděl dřív.
19.3. 16:10 Andrej | skóre: 46 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python

Vím, že ABCLinuxu nikdo aktivně nevyvíjí a že ten kód třeba není (z dnešního pohledu) v dobře udržovatelném stavu, ALE [toto slovo většinou předznamenává nejdůležitější část sdělení], nedalo by se přece jen zakázat anonymní komentování? Všechna tahle individua by to aspoň trochu omezilo. Nedávno zavedená captcha (po opakovaných DOS útocích spočívajících v anonymním zaplevelování poradny) stála podle mě víc úsilí, než kolik by stálo tohle.

ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ
19.3. 17:57 pedro
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Sorry za vyvraceni hypotezy, ale nejsou :-)
19.3. 18:28 Bherzet | skóre: 11 | blog: Bherzetův blog
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Tak se zaregistruj a nebudou ti krást nick.
19.3. 18:01 pedro
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
$ time ./Andrej.py jmena.txt mesice.txt

real 0m0.037s user 0m0.030s sys 0m0.007s

$ time ./prasarnicka.py

real 0m0.029s user 0m0.022s sys 0m0.007s

$ python3 --version Python 3.6.7
Mno, lepsi by to bylo testovat primo v interpretu, ne?
19.3. 18:48 pedro
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Treba takto, ma to zajimavy vysledek a jeste zajimavejsi zaver pro tuto diskusi :-)
import re
import time

def hledej(string, text):
    if text in string:
       pass

def hledej_regex(string, text):
    if re.match(text, string):
        pass

start = time.time()
hledej("toto je nějaký řetězec pro testování", "řetězec")
end = time.time()
print(end - start)

start = time.time()
hledej_regex("toto je nějaký řetězec pro testování", "řetězec")
end = time.time()
print(end - start)
19.3. 19:01 Bherzet | skóre: 11 | blog: Bherzetův blog
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
To nemyslíš vážně, že ne?
19.3. 19:22 pedro
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
hledej_regex("toto je nějaký řetězec pro testování", "toto")

Myslim to naprosto vazne a jestli to je blbost, tak zcela vazne si to necham vysvetlit.
19.3. 19:52 Bherzet | skóre: 11 | blog: Bherzetův blog
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Blbost je volat re.match. Tak si ten regulární výraz ve tvaru "abc|def|..." zkus zkompilovat ručně (tzn. napsat efektivně stejný automat, který jinak generuje ten re.compile – a který generuje i ten re.match, akorát ho použije jen jednou a zahodí) a pochopíš to.
19.3. 19:41 Andrej | skóre: 46 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python

Uf. Co třeba zkusit něco … většího? Mám-li "parafrázovat" původní kód:

#!/usr/bin/env python3

import random
import re
import string
import time

def hledej(input, pattern_list):
  for pattern in pattern_list:
    if pattern in input:
      pass

def hledej_regex(input, pattern_list):
  re.match('|'.join(pattern for pattern in pattern_list), input)

def random_string(length):
  return ''.join(random.choice(string.ascii_letters + string.digits)
                 for _ in range(0, length))

long_input = random_string(1000000)
patterns = [random_string(n % 10 + 10) for n in range(0, 10000)]

for _ in range(0, 10):
  start = time.time()
  hledej(long_input, patterns)
  end = time.time()
  print(f'"in": {end - start}')

  start = time.time()
  hledej_regex(long_input, patterns)
  end = time.time()
  print(f'regex: {end - start}')
ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ
19.3. 18:58 Andrej | skóre: 46 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python

Opravdu? To by jistě nikoho nenapadlo.</sarkasmus>

Stating the obvious: Zajímavé by bylo třeba otestovat, jak se změní doba běhu, když se vstupem o velikosti 1 GB přejdu od tisíce jmen k miliónu jmen. Jestli to poběží 20 milisekund nebo 40 milisekund na takhle malých datech, to je opravdu naprosto nepodstatné.

ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ
19.3. 19:17 pedro
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
A co by se stalo, kdyby jmen zustalo malo a naopak by narostl pocet radku v souboru mesice?
19.3. 19:46 Andrej | skóre: 46 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python

Ideálně by to mělo být lineární v počtu řádků v souboru měsíce a konstantní v počtu jmen. Řešení, které iteruje přes všechna jména na každé řádce, není konstantní v počtu jmen, nýbrž lineární. Ještě jinak: Když zdvojnásobím počet jmen, doba běhu (pro dostatečně dlouhé měsíce a rozumně krátká jména) by měla zůstat stejná, neměla by se zdvojnásobit. (Například algoritmus Aho-Corasick něco takového umožňuje, mimo jiné.)

ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ
19.3. 19:47 Bherzet | skóre: 11 | blog: Bherzetův blog
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Když vezmu ten můj test, tak pro 10**6 iterací (tedy počet řádků v souboru mesice.txt) platí, že pokud je počet jmen ≤ 9, pak je rychlejší operátor in. Při cca 10 jsou obě metody identické, poté jasně vítězí regex. Při 10**7 iteracích a 20 jménech je regex 2x rychlejší.
19.3. 19:01 Bherzet | skóre: 11 | blog: Bherzetův blog
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Režie na spuštění je cca stejná, takže tohle měření je pro orientační představu dostatečné (hrubé přešlapy jako re.match místo re.compile) by to odhalilo. Jinak ale nemá vůbec smysl se tím zabývat, protože náš čas je asi jaksi dražší než desítky strojových milisekund – proto netvrdím, že je můj kód o nějakých 8 milisekund rychlejší. Kdyby skrz to tekly gigabajty dat a na výkonu začalo záležet, tak:

(I.) S algoritmem použitým v mém kódu při zvýšení počtu jmen o řád rychlost klesne také o řád. Andrejův ne, ale při hodně velkém počtu jmen (a nebo příliš dlouhých jménech) se to vykvrdlá na něčem jako internal error in regular expression engine, pokud daná implementace nebude zvládat neomezené regexy (ta moje to, zdá se, zvládá), a nebo spotřebě paměti, protože kompilace o 10 milionech jednoznakových členů mi spotřebovala asi 15 GB RAM a pak to odstřelilo systém.

(II.) Proč používat CPython, který nemá JIT? A ani můj, ani Andrejův kód asi není psán tak, aby byl kompatibilní třeba s Pypy. Netestoval jsem to, možná by to fungovalo, ale rozhodně na to nelze spoléhat.

OPovi to (snad) vyřešilo problém, dohadovat se o tom, jestli je něčí kód o pár milisekund rychlejší, je velká hloupost.
19.3. 19:09 pedro
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Budiz, pro tento pripad. Nicmene si proste trvam na tom, ze z hlediska strojovyho casu a taky z hlediska citelnosti kodu nema smysl v Pythonu pouzivat regex, kdyz funkce hledani v retezci je nejenom vic citelna, ale taky o dost rychlejsi.
19.3. 19:30 Bherzet | skóre: 11 | blog: Bherzetův blog
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Jenže ona není rychlejší. Ne teoreticky (slyšel jsi někdy o časové složitosti a automatech?) a ne prakticky.
#!/usr/bin/env python3

import re
import time
import logging

def search1(line, strs, iterations):
    for _ in range(iterations):
        for s in strs:
            if s in line:
                pass

def search2(line, strs, iterations):
    m = re.compile("|".join(re.escape(s) for s in strs))

    for _ in range(iterations):
        if m.findall(line):
            pass

def test(fn, iterations, names):
    t0 = time.time()
    fn("neobsahuje zadne z jmen", ("karel",) * names, iterations)
    print("Funkce {} probehla za: {} s.".format(fn.__name__, time.time() - t0))

test(search1, 10 ** 6, 10 ** 3)
test(search2, 10 ** 6, 10 ** 3)
19.3. 19:31 Bherzet | skóre: 11 | blog: Bherzetův blog
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Zapomněl jsem na výsledek. U mě (verzi Pythonu už jsem posílal, 3.6.7, klasický CPython):
Funkce search1 probehla za: 29.30871868133545 s.
Funkce search2 probehla za: 0.18523097038269043 s.
19.3. 19:40 Bherzet | skóre: 11 | blog: Bherzetův blog
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Úplně korektní by tedy bylo dávat tam různá jména, protože takhle by to ten regex (resp. výsledný automat) teoreticky mohlo zoptimalizovat. Takže místo ("karel",) * names si dejte třeba [str(i) for i in range(names)]. Výsledek je stejný.
19.3. 19:54 pedro
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Te prvni casti kodu by dost pomohlo any.
19.3. 20:00 pedro
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python
Funkce search1 probehla za: 0.42887043952941895 s.

Funkce search2 probehla za: 0.17212176322937012 s.

Po uprave s any. Ale jinak samozrejme beru ze s narustajici slozitosti se zacne projevovat vyhodnost regexu.
19.3. 19:53 Andrej | skóre: 46 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Cyklus s více podmínkami; Python

To by byla pravda pro jeden string.

Tady bylo úkolem matchovat několik stringů zároveň.

Máš možnost je matchovat

  • buď v čase lineárním vůči počtu vzorů i vstupu, tj. zeptat se na každý pomocí in,
  • nebo třeba v čase konstantním vůči počtu vzorů a lineárním vůči vstupu, například něčím jako Aho-Corasick nebo zkrátka jedním z mnoha algoritmů, které dovedou implementovat jednoduchý regexp se svislítky.

Tak… Už?

ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.