Python-ban normális nagy precizitású timer hogy használható?
Nem találtam normális nagy finomságú timer-t ami a lehető legnagyobb precizitású. Van a time mondulon belül a time() függvény mely unix time-t adja vissza "folytonosan", lebegőpontosan. Nem tudom a valódi felbontását, eleve "büdös" ,hogy lebegőpontosra normálja. Adja vissza rendesen integer-ként.
Találtam egy elsőre jónak tűnő nanotime modult. Feltelepítettem. Működés közben eléggé gyanús volt, hogy mindig páros számnyi nanoszekundum telik el, ráadásul az utolsó bájt is mindig 0 azaz int(nanotime.now()) & 255 == 0 feltétel mindig igaz. Megnéztem az implementációt, viccnek is gyenge. Ugyanúgy a time meg egyéb modulokat hívja meg amit amúgy is meghívhatnék és egyszerűen csak a megfelelő szorzással meg kasztolással stb. int-é avagy saját típussá alakítja amivel semmi újat lényegében nem tesz hozzá. Legalább úgy lenne megcsinálva, hogy pontosabb legyen a lebegőpontosságból adódó hiba mely elég durván levágja az utolsó bájtot mint említettem.
Ami kihozható a time modulból:
import time
print int(("%.9f" % time.time()).replace('.',''))
Ez visszadja az unix időszámítástól eltelt nanoszekundomok számát. Ezzel az a baj, hogy "ronda" ez a string-be int-be kasztolás, "ronda" hogy lebegőpontosból normált értékre támaszkodik, nem tudom a tényleges időfelbontást.
Szóval nem azaz elvárás hogy gigahertzel pörgetett órajelem legyem, hanem le tudjam kérdezni (függvénnyel), hogy pl 450 megahertzel pörög a számláló és ne lebegőpontos érték legyen az "eredeti" hanem egész. Nem kötelező unix időszámításból származó értéknek lenni. Jó lenne platformfüggetlen megoldás, de ha nem lehet akkor a mostani legújabb 64 bites Ubuntu platformmal kompatibilis legyen.
t0 := get_unix_time;
t1 := (get_unix_time - t0);
Aztán a t1-edet abba cast-olod amibe akarod.
De létezik GetTickCount függv. is.
import win32api
return float(time.time()) - float(win32api.GetTickCount() / 1000)
"Nem nagyon értem hogyan szeretnél nagyobb precizitást kiparszolni, mint amire a rendszer képes."
Pont hogy azt szeretném amire a rendszer képes, ezt magyaráztam, meg lekérdezni az időfelbontást mivel ez eltérő lehet különböző gépek között. Az a baj a time modullal többek között, hogy nem tudom a valódi időfelbontást, tudom interpolálni a lebegőpontos értéket átskálázva nagyon nagy felbontású integer időszeletekre, de nem tudom a valódi felbontást.
@ma 10:20
Milyen jó, hogy lehetőleg platformfüggetlen megoldást kértem vagy ha nem lehet akkor 64 bites Ubuntu platformmal kompatibiliset. A GetTickCount() milliszekundumba adja meg windows alatt, a rendszer képes mikroszekundumnál pontosabban visszaadni.
Furcsa egy madár vagy te, kérdező.
Mondd, ifdef direktíváról hallottál már?
Nanosec-es timerről meg ne nagyon álmodj PC-s környezetben.
"Az a baj a time modullal többek között, hogy nem tudom a valódi időfelbontást, tudom interpolálni a lebegőpontos értéket átskálázva nagyon nagy felbontású integer időszeletekre, de nem tudom a valódi felbontást. "
Essen már le, hogy platformtól függetlenül ~ 1 mSec a felbontás. A rendszer timerétől függ, nem az általad kapott értéktől, banyek.
Majd ha beraksz a linuxod alá egy valós idejű kernelt, amiben meghackeled a timert meg az ütemezőt, akkor kikényszeríthesz valamivel precízebb felbontást.
bash alatt: date +%s%N
"time.perf_counter() funkciót próbáltad már?"
Nem próbáltam, az python3-ban működik, bár nem mondtam, hogy abban nem érdekel, de alapvetően "sima" python-t használok. Továbbá az is lebegőpontos, a pontosságát nem tudom.
"Mondd, ifdef direktíváról hallottál már?"
Igen. Alapvetően olyan nyelveknél van amelyek compiler-olva szoktak lenni és nem interpretálva.
"Nanosec-es timerről meg ne nagyon álmodj PC-s környezetben."
( Bash alatt: date +%s%N )
Anno c,c++, Delphi alatt használtam nagy precizitású timer-t. QueryPerformanceCounter rendszerfüggvénnyel, a növekedési frekvenciája pedig QueryPerformanceFrequency függvényel, ami sok megahertz volt, mai szemmel ócska gépen.
Pont ezért magyarázom már az elejétől fogva, hogy le kell kérdezni azt is, hogy a timer valódi pontossága hányszorosa a nanosec pontosságnak.
"Majd ha beraksz a linuxod alá egy valós idejű kernelt, amiben meghackeled a timert meg az ütemezőt, akkor kikényszeríthesz valamivel precízebb felbontást."
Nem olyan pontossággal akarok ütemezni, sleep-elni szálat/processzt hanem a timer-t lekérdezni, ha windows alatt évekkel ezelőtt lehetett c-ben akkor nonszensz 2017-ben linux rendszer alatt, 1 évnél újabb gépen ne lenne lehetséges.
Sorry hogy "bash alatt: date +%s%N" duplán van.
"Igen. Alapvetően olyan nyelveknél van amelyek compiler-olva szoktak lenni és nem interpretálva."
Nem ez a probléma, hogy ne tudnám megoldani a különböző platformok közötti átjárhatóságot, de ha lehet akkor eleve platformfüggetlenül oldanám meg.
Rájöttem. Ezt kell értelemszerűen módosítani és megkapom amit akartam:
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!