Python regexp sebesség

2010.01.17. 19:15

Ki kell nyernem kb. 1 TB-nyi logból mindenféle adatot, erre pedig számomra a legkényelmesebb a python. A feladat nagy része regexppel az engem érdeklő sorok, a bennük lévő információ megtalálása, majd ezek kigyűjtése egy dictbe (állapottábla-szerűen), végül pedig az eredmény kiírása (egy sor).

A gép, amin a program fut egy pécé Debiannal, és ennek köszönhetően egy régi Pythonnal (2.4.4).

Kíváncsi voltam, hogy melyik verzióval fut le gyorsabban a program, így egy 1 millió soros inputon kipróbáltam pár verziót, mindegyiket ötször lefuttatva, az öt futásból a legrövidebb időt kiemelve:

Python verzió/futásidőLegrövidebb futási idő (másodperc)
2.4.413,3185780048
2.6.414,6761689186
2.7a214,4896569252
unladen swallow r100215,5905060768
unladen swallow r1002 -O315,6231729984
unladen swallow r1002 -j always -O314,1942150593

Tanulság: a legújabb nem mindig a legjobb. :(

ui: az unladen swallow viszonylagos lassúsága valószínűleg a menetközbeni JIT-nek köszönhető, ami a -j always-szel eltűnik (pontosabban induláskor megtörténik, azaz később nem lassít)

A bejegyzés trackback címe:

https://suckit.blog.hu/api/trackback/id/tr871680133

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Trevize 2010.01.18. 13:48:28

Szuper: jó kis fejlesztéssel kapcsolatos Post! :)

Hasonló feladattal (kt napi syslogot kaptam, abból kellett az összes fajta üzenetre regexpet gyártani. Begzippeltem a két fájlt (azt hiszem kb 1 GB volt darabja), és a szkript a "gunzip -c" outputját dolgozta fel.) én is küzdöttem, akkoriban Perl+precompiled regexp volt a nyerő, bár benchmarkot nem végeztem. Pythonban is van precompiled regexp?

blackshepherd · http://suckit.blog.hu 2010.01.19. 09:58:50

Van pythonban is: docs.python.org/library/re.html (re.compile)
Gondolkoztam rajta, hogy el kellene végezni ugyanezt perllel is, de aztán a lustaság győzött... :)

bagoj ur 2010.01.20. 20:41:58

@blackshepherd: pedig épp akartam ajánlani, hogy izzítsd rá a perl-t. :)

Trevize 2010.01.21. 10:45:29

@blackshepherd: Na és a gzippelés-téma? Azzal szerintem jelentősen csökkenthető az I/O érintettség.

blackshepherd · http://suckit.blog.hu 2010.01.21. 18:38:22

@Trevize: tömörítve vannak a logok, nem a diszkio volt szűk, hanem a python sebessége (CPU limites)