ugrás a tartalomhoz

Csal a linuxos grep?

mind1 valami név · 2020. Jún. 27. (Szo), 20.01
Regex alapú kereséssel küzdöttem, mert amit Pythonban megírtam, nagyon lassúnak tűnt nagy tömegű adatnál.
Gyakorlatilag a "grep -va -f pattern.txt source.txt" parancsot írtam át python 3-ra.
Az időmérést úgy próbáltam kivitelezni, hogy a kimenetet átküldtem a /dev/null-ba.

time ./script.sh >/dev/null
time ./script.py >/dev/null
A .sh végű, ami a grep-t tartalmazta, úgy .2sec alatt futott le. A python 7sec (35x eltérés)
Mivel túl sok volt a kimenet, első körben meg akartam nézni, hogy a két szkript azonos számú sort produkál-e:

time ./script.sh | wc -l >/dev/null
time ./script.py | wc -l >/dev/null
És itt koppantam egy nagyot: a grep-es verzió pár másodperccel hosszabb ideig futott.
Próbáltam megnézni strace segítségével, hogy mit művel ha közvetlenül a /dev/null-ba van irányítva a stdout, de csak annyit láttam, hogy egy nagyságrenddel kevesebb rendszerhívást végez olyankor.
Mintha nem is olvasná végig az inputot...
Ez lehetséges?
Tényleg az első olyan sornál ...
(ufff, na mindegy, már itt hagyom, okulásképp az utókornak :) )

... szóval ahogy ezt írtam, akkor esett le: a grep, ha nem kell semmit kiküldenie a stdout-ra, akkor az exit code-ban ($?) adja vissza, hogy sikeres volt-e a keresés vagy sem. Ehhez viszont nem kell végigmennie a teljes inputon, elég ha az első olyan sorig megy, ami miatt 0-val térhet vissza. Ergo a -v miatt az első olyan sorig megy, ami nem illeszkedik egyik megadott mintára sem, utána kilép. Az én programom meg mindenképp végigmegy, mivel szükségem van általában az outputra. :)

Úgyhogy sikerült gyorsabb grep-t írni pythonban, mint amilyen az eredeti C-ben. :)
 
1

Úgy néz ki valóban azt

kuka · 2020. Jún. 27. (Szo), 22.35
Úgy néz ki valóban azt teszi:

  if ((exit_on_match | dev_null_output) || list_files != LISTFILES_NONE)
    {
      count_matches = false;
      done_on_match = true;
    }
(Erről eszembe jut a mondás, hogy igazi programozók nem írnak kommenteket, hanem elég hosszú változóneveket használnak, hogy a kód érthető legyen.)
2

Na az nem jutott eszembe,

mind1 valami név · 2020. Jún. 27. (Szo), 22.51
Na az nem jutott eszembe, hogy a forrásba belenézzek. Viszont úgy húsz éve olvastam ezt valami doksiban, az ugrott be...