time.perf_counter fehlt...

Probleme bei der Installation?
Antworten
stsemant
User
Beiträge: 31
Registriert: Sonntag 24. Dezember 2017, 13:06

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?
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

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
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Hast du evtl. dein eigenes Skript time.py gennant? Wenn ja, benenn es um, sonst wird probiert, daraus zu importieren.

Gruß Whitie
stsemant
User
Beiträge: 31
Registriert: Sonntag 24. Dezember 2017, 13:06

okay, großer Fehler meinerseits: in python 3 funktioniert´s.
Weiß hier jemand, wie ich den time.perf_counter() für python2 bekomme?
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da gibts den nicht. Warum benutzt du nicht Python 3?
stsemant
User
Beiträge: 31
Registriert: Sonntag 24. Dezember 2017, 13:06

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
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du kannst auch einfach time.time benutzen.

Oder mit ctypes an die C-libraries ran & clock oder so selbst aufrufen.
stsemant
User
Beiträge: 31
Registriert: Sonntag 24. Dezember 2017, 13:06

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. =)
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@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?
stsemant
User
Beiträge: 31
Registriert: Sonntag 24. Dezember 2017, 13:06

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?
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
stsemant
User
Beiträge: 31
Registriert: Sonntag 24. Dezember 2017, 13:06

Gut. Vielen Dank für die Antworten!
Antworten