Seite 1 von 1

time.perf_counter fehlt...

Verfasst: Freitag 12. Januar 2018, 16:11
von stsemant
Hallo liebes Forum,
Ich möchte gerne in einem python-script auf meinem PI den time.perf_counter() verwenden, da ich hörte, dass er zur Messung von Laufzeiten sehr gut geeignet ist, denn genau das habe ich unter anderem in meinem Programm vor.
bei der Ausführung erscheint aber nur:

Code: Alles auswählen

Attribute Error: 'module' object has no attribute 'perf_counter'
Ich habe python Version 3.4.2 auf dem PI.
Könnt Ihr mir sagen, wie ich nun an den counter rankomme? muss ich irgendwas nachinstallieren?

Re: time.perf_counter fehlt...

Verfasst: Freitag 12. Januar 2018, 16:23
von __deets__
Kannst du mal bitte den gesamten Stacktrace zeigen?

Bei mir klappt das naemlich problemlos:

Code: Alles auswählen

Python 3.4.1 (v3.4.1:c0e311e010fc, May 18 2014, 00:54:21)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import time
>>> time.perf_counter()
174851.011235398

Re: time.perf_counter fehlt...

Verfasst: Freitag 12. Januar 2018, 22:05
von Whitie
Hast du evtl. dein eigenes Skript time.py gennant? Wenn ja, benenn es um, sonst wird probiert, daraus zu importieren.

Gruß Whitie

Re: time.perf_counter fehlt...

Verfasst: Montag 15. Januar 2018, 14:06
von stsemant
okay, großer Fehler meinerseits: in python 3 funktioniert´s.
Weiß hier jemand, wie ich den time.perf_counter() für python2 bekomme?

Re: time.perf_counter fehlt...

Verfasst: Montag 15. Januar 2018, 14:07
von __deets__
Da gibts den nicht. Warum benutzt du nicht Python 3?

Re: time.perf_counter fehlt...

Verfasst: Montag 15. Januar 2018, 14:11
von stsemant
Es besteht keine Chance den für python2 zu bekommen? ärgerlich.
Naja, mein ganzes Programm habe ich bisher in python2 geschrieben. und wenn ich das in python3 starten will, bekomme ich schon kleine Probleme (hab es eben erst aussprobier). Zum Beispiel hat er hier Probleme mit "MySQLdb"...kennt er nicht

Re: time.perf_counter fehlt...

Verfasst: Montag 15. Januar 2018, 14:16
von __deets__
Du kannst auch einfach time.time benutzen.

Oder mit ctypes an die C-libraries ran & clock oder so selbst aufrufen.

Re: time.perf_counter fehlt...

Verfasst: Montag 15. Januar 2018, 14:21
von stsemant
oder ich führe mit os.system("python3 pfad/datei.py") die Datei aus. Oder macht man sowas nicht?

Was ist deiner Meinung nach der präzieseste Timer, welcher in python2 läuft. Ich möchte halt so genau wie möglicch Zeiten messen. Es kann ja durchaus vorkommen, dass ich mit 300Hz über die serielle Schnittstelle Messwerte erfassen soll, da soll dann natürlich nach 300 Messungen erst eine Sekunde vergangen sein. =)

Re: time.perf_counter fehlt...

Verfasst: Montag 15. Januar 2018, 14:36
von Sirius3
@stsemant: wenn die Datei nicht mit Python3 läuft, hilft es auch nichts, die mit system aufzurufen (wobei man das auch nicht macht). time.time ist genauso präzise wie time.perf_counter, der einzige Unterschied ist, dass time.time "Sprünge" macht, wenn man die Uhrzeit umstellt; solange man das nicht macht, sind beide Funktionen identisch.

Zur Messung von Laufzeiten sind die Funktionen nicht unbedingt tauglich, vor allem, wenn Du die 300mal pro Sekunde aufrufen möchtest. Was möchtest Du eigentlich machen?

Re: time.perf_counter fehlt...

Verfasst: Montag 15. Januar 2018, 14:46
von stsemant
Die sind absolut identisch? interessant.
Als Student mach ich gerade Praktikum in einer Firma, die Sensoren mit Dehnungsmeßstreifen herstellt. Die haben ein Raspberry PI mit einem Gleichspannungsverstärker entwickelt. Über die serielle Schnittstelle des PI's kann man mit diesem kommunizieren. Okay 300Hz ist aktuell vielleicht etwas hochgegriffen, aber das ist ja irgendwann die Zielstellung. Auf jeden Fall sendet man einen Befehl hin, und bekomm einen Antwortframe zurück, aus welchem der Messwert entnommen wird. Anschließend wartet man noch die verbleibende Zeit der Periodendauer (1/f = 1/300Hz) ehe man wieder einen Befehl zur Messwertabfrage hinsendet. Fahre ich bei diesem Vorhaben mit time.time() am besten?

Re: time.perf_counter fehlt...

Verfasst: Montag 15. Januar 2018, 14:57
von __deets__
Besser als time.time ist time.monotonic (aus dem von Sirius genannten Gruenden).

Der Punkt ist: die Zeitberechnung ist da allemal praezise genug, nur bekommst du vom OS keine Garantie darueber, das du dann auch genau 1/300 Sekunden spaeter dran kommst. Das ist das viel groessere Problem. Entweder reicht es, zB vor und nach der Messung eine Zeitnahme zu machen, und dann den Durchschnitt zu bilden, um daraus wiederum einen Zeitstempel fuer den Messwert zu machen. Und dann zu warten, bis zur naechsten Periode, aber ohne Garantie, das man genau auf den Punkt dran kommt.

Oder du willst das wirklich praezise, dann vergiss Python (zumindest fuer die serielle Kommunikation). Sonder benutz C/C++ sowie einen PREEMPT_RT-Kernel, der dann bessere Garantien gibt. Dann fuetterst du dein Python-Programm mit dessen Ausgaben.

Re: time.perf_counter fehlt...

Verfasst: Montag 15. Januar 2018, 15:23
von stsemant
Gut. Vielen Dank für die Antworten!