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.4 | 13,3185780048 |
2.6.4 | 14,6761689186 |
2.7a2 | 14,4896569252 |
unladen swallow r1002 | 15,5905060768 |
unladen swallow r1002 -O3 | 15,6231729984 |
unladen swallow r1002 -j always -O3 | 14,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)
Szerző: blackshepherd
5 komment
Címkék: performance python regexp regular expression unladen swallow
A bejegyzés trackback címe:
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
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
Gondolkoztam rajta, hogy el kellene végezni ugyanezt perllel is, de aztán a lustaság győzött... :)