Kezdőoldal » Számítástechnika » Programozás » Python-ban normális nagy...

Python-ban normális nagy precizitású timer hogy használható?

Figyelt kérdés

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.


2017. febr. 27. 01:21
 1/9 anonim ***** válasza:
Nem nagyon értem hogyan szeretnél nagyobb precizitást kiparszolni, mint amire a rendszer képes.
2017. febr. 27. 09:52
Hasznos számodra ez a válasz?
 2/9 anonim ***** válasza:

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)

2017. febr. 27. 10:20
Hasznos számodra ez a válasz?
 3/9 A kérdező kommentje:

"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.

2017. febr. 27. 11:47
 4/9 anonim ***** válasza:
time.perf_counter() funkciót próbáltad már?
2017. febr. 27. 13:49
Hasznos számodra ez a válasz?
 5/9 anonim ***** válasza:

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.

2017. febr. 27. 15:06
Hasznos számodra ez a válasz?
 6/9 anonim ***** válasza:

"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.

2017. febr. 27. 15:24
Hasznos számodra ez a válasz?
 7/9 A kérdező kommentje:

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.

2017. febr. 27. 16:13
 8/9 A kérdező kommentje:

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.

2017. febr. 27. 16:17
 9/9 A kérdező kommentje:

Rájöttem. Ezt kell értelemszerűen módosítani és megkapom amit akartam:

[link]

2017. febr. 28. 00:17

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!