PEP 410 – Verwenden Sie den Typ decimal.Decimal für Zeitstempel
- Autor:
- Victor Stinner <vstinner at python.org>
- Status:
- Abgelehnt
- Typ:
- Standards Track
- Erstellt:
- 01-Feb-2012
- Python-Version:
- 3.3
- Resolution:
- Python-Dev Nachricht
Inhaltsverzeichnis
- Ablehnungsbescheid
- Zusammenfassung
- Begründung
- Spezifikation
- Abwärtskompatibilität
- Einwand: Genauigkeit von Uhren
- Alternativen: Zeitstempeltypen
- Alternativen: API-Design
- Fügen Sie ein String-Argument hinzu, um den Rückgabetyp anzugeben
- Fügen Sie ein globales Flag hinzu, um den Zeitstempeltyp zu ändern
- Fügen Sie ein Protokoll zum Erstellen eines Zeitstempels hinzu
- Fügen Sie neue Felder zu os.stat hinzu
- Fügen Sie ein boolesches Argument hinzu
- Fügen Sie neue Funktionen hinzu
- Fügen Sie ein neues Modul namens hires hinzu
- Links
- Urheberrecht
Ablehnungsbescheid
Diese PEP wird abgelehnt. Siehe https://mail.python.org/pipermail/python-dev/2012-February/116837.html.
Zusammenfassung
Decimal wird zum offiziellen Typ für hochauflösende Zeitstempel, um Python die Unterstützung neuer Funktionen mit Nanosekundenauflösung ohne Präzisionsverlust zu ermöglichen.
Begründung
Python 2.3 führte Gleitkomma-Zeitstempel zur Unterstützung von Untersekundenauflösungen ein. os.stat() verwendet seit Python 2.5 standardmäßig Gleitkomma-Zeitstempel. Python 3.3 führte Funktionen ein, die Nanosekundenauflösungen unterstützen
- os-Modul: futimens(), utimensat()
- time-Modul: clock_gettime(), clock_getres(), monotonic(), wallclock()
os.stat() liest Nanosekunden-Zeitstempel, gibt aber Zeitstempel als Gleitkommazahlen zurück.
Der Python-Gleitkommatyp verwendet das binäre 64-Bit-Format des IEEE 754-Standards. Bei einer Auflösung von einer Nanosekunde (10-9) verlieren Gleitkomma-Zeitstempel bei Werten größer als 224 Sekunden (194 Tage: 14. Juli 1970 bei einem Epochen-Zeitstempel) an Genauigkeit.
Nanosekundenauflösung ist erforderlich, um die genaue Änderungszeit auf Dateisystemen einzustellen, die Nanosekunden-Zeitstempel unterstützen (z. B. ext4, btrfs, NTFS usw.). Sie hilft auch beim Vergleich der Änderungszeit, um festzustellen, ob eine Datei neuer als eine andere ist. Anwendungsfälle: Kopieren der Änderungszeit einer Datei mit shutil.copystat(), Erstellen eines TAR-Archivs mit dem tarfile-Modul, Verwalten einer Mailbox mit dem mailbox-Modul usw.
Eine beliebige Auflösung wird einer festen Auflösung (wie Nanosekunde) vorgezogen, um die API nicht ändern zu müssen, wenn eine bessere Auflösung erforderlich ist. Beispielsweise verwendet das NTP-Protokoll Bruchteile von 232 Sekunden (ungefähr 2,3 × 10-10 Sekunde), während NTP Protokollversion 4 Bruchteile von 264 Sekunden (5,4 × 10-20 Sekunde) verwendet.
Hinweis
Bei einer Auflösung von 1 Mikrosekunde (10-6) verlieren Gleitkomma-Zeitstempel für Werte größer als 233 Sekunden (272 Jahre: 16. März 2242 bei einem Epochen-Zeitstempel) an Genauigkeit. Bei einer Auflösung von 100 Nanosekunden (10-7, Auflösung unter Windows) verlieren Gleitkomma-Zeitstempel für Werte größer als 229 Sekunden (17 Jahre: 5. Januar 1987 bei einem Epochen-Zeitstempel) an Genauigkeit.
Spezifikation
Fügen Sie decimal.Decimal als neuen Typ für Zeitstempel hinzu. Decimal unterstützt jede Zeitstempelauflösung, unterstützt arithmetische Operationen und ist vergleichbar. Es ist möglich, einen Decimal in einen Float zu konvertieren, auch wenn die Konvertierung Genauigkeit verlieren kann. Die Auflösung der Uhr kann auch in einem Decimal-Objekt gespeichert werden.
Fügen Sie ein optionales Argument timestamp zu
- os-Modul: fstat(), fstatat(), lstat(), stat() (st_atime, st_ctime und st_mtime Felder der stat-Struktur), sched_rr_get_interval(), times(), wait3() und wait4()
- resource-Modul: ru_utime und ru_stime Felder von getrusage()
- signal-Modul: getitimer(), setitimer()
- time-Modul: clock(), clock_gettime(), clock_getres(), monotonic(), time() und wallclock()
Der Wert des Arguments timestamp kann float oder Decimal sein, wobei float aus Kompatibilitätsgründen weiterhin der Standard ist. Die folgenden Funktionen unterstützen Decimal als Eingabe
- datetime-Modul: date.fromtimestamp(), datetime.fromtimestamp() und datetime.utcfromtimestamp()
- os-Modul: futimes(), futimesat(), lutimes(), utime()
- select-Modul: epoll.poll(), kqueue.control(), select()
- signal-Modul: setitimer(), sigtimedwait()
- time-Modul: ctime(), gmtime(), localtime(), sleep()
Die Funktion os.stat_float_times() ist veraltet: Verwenden Sie stattdessen eine explizite Umwandlung mit int().
Hinweis
Das decimal-Modul ist in Python implementiert und langsamer als float, aber es gibt eine neue C-Implementierung, die fast bereit zur Aufnahme in CPython ist.
Abwärtskompatibilität
Der Standard-Zeitstempeltyp (float) bleibt unverändert, sodass keine Auswirkungen auf die Abwärtskompatibilität oder die Leistung bestehen. Der neue Zeitstempeltyp, decimal.Decimal, wird nur zurückgegeben, wenn er explizit angefordert wird.
Einwand: Genauigkeit von Uhren
Computeruhren und Betriebssysteme sind ungenau und liefern in der Praxis keine Nanosekundengenauigkeit. Eine Nanosekunde ist das, was benötigt wird, um ein paar CPU-Instruktionen auszuführen. Selbst auf einem Echtzeitbetriebssystem ist eine Nanosekunden-präzise Messung bereits veraltet, wenn sie von der übergeordneten Anwendung verarbeitet wird. Ein einziger Cache-Miss in der CPU macht die Präzision wertlos.
Hinweis
Linux ist *tatsächlich* in der Lage, Zeit in Nanosekundenpräzision zu messen, auch wenn es seine Uhr nicht mit Nanosekundenpräzision mit UTC synchron halten kann.
Alternativen: Zeitstempeltypen
Zur Unterstützung von Zeitstempeln mit beliebiger oder Nanosekundenauflösung wurden die folgenden Typen in Betracht gezogen
- decimal.Decimal
- Anzahl der Nanosekunden
- 128-Bit-Gleitkommazahl
- datetime.datetime
- datetime.timedelta
- Tupel aus ganzen Zahlen
- timespec-Struktur
Kriterien
- Arithmetik mit Zeitstempeln muss möglich sein
- Zeitstempel müssen vergleichbar sein
- Eine beliebige Auflösung oder zumindest eine Auflösung von einer Nanosekunde ohne Präzisionsverlust
- Es sollte möglich sein, den neuen Zeitstempel für Abwärtskompatibilität in einen Float zu konvertieren
Eine Auflösung von einer Nanosekunde reicht aus, um alle aktuellen C-Funktionen zu unterstützen.
Die beste Auflösung, die von Betriebssystemen verwendet wird, ist eine Nanosekunde. In der Praxis liegt die Genauigkeit der meisten Uhren näher an Mikrosekunden als an Nanosekunden. Daher scheint es vernünftig, eine feste Auflösung von einer Nanosekunde zu verwenden.
Anzahl der Nanosekunden (int)
Eine Nanosekundenauflösung reicht für alle aktuellen C-Funktionen aus, und daher kann ein Zeitstempel einfach eine Zahl von Nanosekunden sein, eine ganze Zahl, keine Gleitkommazahl.
Das Format "Anzahl der Nanosekunden" wurde abgelehnt, da es neue spezialisierte Funktionen für dieses Format erfordern würde, da es nicht möglich ist, eine Anzahl von Nanosekunden und eine Anzahl von Sekunden anhand des Objekttyps zu unterscheiden.
128-Bit-Gleitkommazahl
Fügen Sie einen neuen IEEE 754-2008 Quad-Precision Binär-Gleitkommatyp hinzu. Der IEEE 754-2008 Quad-Precision Float hat 1 Vorzeichenbit, 15 Exponentenbits und 112 Mantissenbits. 128-Bit-Float wird von GCC (4.3), Clang und ICC-Compilern unterstützt.
Python muss portabel sein und kann sich daher nicht auf einen Typ verlassen, der nur auf einigen Plattformen verfügbar ist. Beispielsweise unterstützt Visual C++ 2008 keinen 128-Bit-Float, obwohl er zum Erstellen der offiziellen Windows-Ausführbaren verwendet wird. Ein weiteres Beispiel: GCC 4.3 unterstützt __float128 im 32-Bit-Modus unter x86 nicht (aber GCC 4.4 tut es).
Es gibt auch ein Lizenzproblem: GCC verwendet die MPFR-Bibliothek für 128-Bit-Floats, eine Bibliothek, die unter der GNU LGPL-Lizenz vertrieben wird. Diese Lizenz ist mit der Python-Lizenz nicht kompatibel.
Hinweis
Die x87-Gleitkommaeinheit von Intel-CPUs unterstützt 80-Bit-Floats. Dieses Format wird nicht vom SSE-Befehlssatz unterstützt, der jetzt Gleitkommazahlen vorgezogen wird, insbesondere auf x86_64. Andere CPU-Hersteller unterstützen keine 80-Bit-Floats.
datetime.datetime
Der Typ datetime.datetime ist die natürliche Wahl für einen Zeitstempel, da klar ist, dass dieser Typ einen Zeitstempel enthält, während int, float und Decimal rohe Zahlen sind. Es ist ein absoluter Zeitstempel und daher gut definiert. Er bietet direkten Zugriff auf Jahr, Monat, Tag, Stunden, Minuten und Sekunden. Er hat zeitbezogene Methoden wie Methoden zur Formatierung des Zeitstempels als Zeichenkette (z. B. datetime.datetime.strftime).
Das Hauptproblem ist, dass mit Ausnahme von os.stat(), time.time() und time.clock_gettime(time.CLOCK_GETTIME) alle Zeitfunktionen einen unbestimmten Startpunkt und keine Zeitzoneninformationen haben und daher nicht in datetime.datetime konvertiert werden können.
datetime.datetime hat auch Probleme mit der Zeitzone. Beispielsweise können ein datetime-Objekt ohne Zeitzone (unaware) und ein datetime mit Zeitzone (aware) nicht verglichen werden. Es gibt auch ein Reihenfolgeproblem mit der Sommerzeit (DST) bei der doppelten Stunde des Wechsels von DST zu Normalzeit.
datetime.datetime wurde abgelehnt, da es nicht für Funktionen verwendet werden kann, die einen unbestimmten Startpunkt verwenden, wie os.times() oder time.clock().
Für time.time() und time.clock_gettime(time.CLOCK_GETTIME): Es ist bereits möglich, die aktuelle Zeit als datetime.datetime-Objekt zu erhalten durch
datetime.datetime.now(datetime.timezone.utc)
Für os.stat() ist es einfach, ein datetime.datetime-Objekt aus einem decimal.Decimal-Zeitstempel in der UTC-Zeitzone zu erstellen
datetime.datetime.fromtimestamp(value, datetime.timezone.utc)
Hinweis
datetime.datetime unterstützt nur Mikrosekundenauflösung, kann aber zur Unterstützung von Nanosekunden erweitert werden.
datetime.timedelta
datetime.timedelta ist die natürliche Wahl für einen relativen Zeitstempel, da klar ist, dass dieser Typ einen Zeitstempel enthält, während int, float und Decimal rohe Zahlen sind. Er kann mit datetime.datetime verwendet werden, um einen absoluten Zeitstempel zu erhalten, wenn der Startpunkt bekannt ist.
datetime.timedelta wurde abgelehnt, da es nicht in Float konvertiert werden kann und eine feste Auflösung hat. Ein neuer Standard-Zeitstempeltyp reicht aus, Decimal wird datetime.timedelta vorgezogen. Die Konvertierung eines datetime.timedelta in Float erfordert einen expliziten Aufruf der Methode datetime.timedelta.total_seconds().
Hinweis
datetime.timedelta unterstützt nur Mikrosekundenauflösung, kann aber zur Unterstützung von Nanosekunden erweitert werden.
Tupel aus ganzen Zahlen
Um C-Funktionen in Python verfügbar zu machen, ist ein Tupel aus ganzen Zahlen die natürliche Wahl zur Speicherung eines Zeitstempels, da die C-Sprache Strukturen mit Ganzzahlfeldern verwendet (z. B. timeval- und timespec-Strukturen). Die Verwendung von nur ganzen Zahlen vermeidet Präzisionsverluste (Python unterstützt Ganzzahlen beliebiger Länge). Das Erstellen und Parsen eines Tupels aus ganzen Zahlen ist einfach und schnell.
Abhängig vom genauen Format des Tupels kann die Auflösung beliebig oder fest sein. Die Auflösung kann so gewählt werden, dass der Präzisionsverlust geringer ist als eine beliebige Grenze wie eine Nanosekunde.
Verschiedene Formate wurden vorgeschlagen
- A: (Zähler, Nenner)
- Wert = Zähler / Nenner
- Auflösung = 1 / Nenner
- Nenner > 0
- B: (Sekunden, Zähler, Nenner)
- Wert = Sekunden + Zähler / Nenner
- Auflösung = 1 / Nenner
- 0 <= Zähler < Nenner
- Nenner > 0
- C: (intpart, floatpart, base, exponent)
- Wert = intpart + floatpart / baseexponent
- Auflösung = 1 / base exponent
- 0 <= floatpart < base exponent
- base > 0
- exponent >= 0
- D: (intpart, floatpart, exponent)
- Wert = intpart + floatpart / 10exponent
- Auflösung = 1 / 10 exponent
- 0 <= floatpart < 10 exponent
- exponent >= 0
- E: (sec, nsec)
- Wert = sec + nsec × 10-9
- Auflösung = 10 -9 (Nanosekunde)
- 0 <= nsec < 10 9
Alle Formate unterstützen eine beliebige Auflösung, außer Format (E).
Das Format (D) kann den genauen Wert möglicherweise nicht speichern (möglicherweise Präzisionsverlust), wenn die Taktfrequenz beliebig ist und keine Potenz von 2 oder 10 ist. Das Format (C) hat ein ähnliches Problem, aber in diesem Fall ist es möglich, base=Frequenz und exponent=1 zu verwenden.
Die Formate (C), (D) und (E) ermöglichen Optimierungen für die Konvertierung in Float, wenn die Basis 2 ist, und in decimal.Decimal, wenn die Basis 10 ist.
Das Format (A) ist ein einfacher Bruch. Es unterstützt beliebige Präzision, ist einfach (nur zwei Felder), erfordert nur eine einfache Division, um den Gleitkommawert zu erhalten, und wird bereits von float.as_integer_ratio() verwendet.
Um die Implementierung zu vereinfachen (insbesondere die C-Implementierung zur Vermeidung von Integer-Überläufen), kann ein Zähler, der größer als der Nenner ist, akzeptiert werden. Das Tupel kann später normalisiert werden.
Tupel aus ganzen Zahlen wurden abgelehnt, da sie keine arithmetischen Operationen unterstützen.
Hinweis
Unter Windows verwendet die Taktquelle QueryPerformanceCounter() die Frequenz des Prozessors, eine beliebige Zahl, die möglicherweise keine Potenz von 2 oder 10 ist. Die Frequenz kann mit QueryPerformanceFrequency() gelesen werden.
timespec-Struktur
timespec ist die C-Struktur, die zur Speicherung von Zeitstempeln mit Nanosekundenauflösung verwendet wird. Python kann einen Typ mit derselben Struktur verwenden: (Sekunden, Nanosekunden). Der Einfachheit halber werden arithmetische Operationen auf timespec unterstützt.
Beispiel für einen unvollständigen timespec-Typ, der Addition, Subtraktion und Konvertierung in Float unterstützt
class timespec(tuple):
def __new__(cls, sec, nsec):
if not isinstance(sec, int):
raise TypeError
if not isinstance(nsec, int):
raise TypeError
asec, nsec = divmod(nsec, 10 ** 9)
sec += asec
obj = tuple.__new__(cls, (sec, nsec))
obj.sec = sec
obj.nsec = nsec
return obj
def __float__(self):
return self.sec + self.nsec * 1e-9
def total_nanoseconds(self):
return self.sec * 10 ** 9 + self.nsec
def __add__(self, other):
if not isinstance(other, timespec):
raise TypeError
ns_sum = self.total_nanoseconds() + other.total_nanoseconds()
return timespec(*divmod(ns_sum, 10 ** 9))
def __sub__(self, other):
if not isinstance(other, timespec):
raise TypeError
ns_diff = self.total_nanoseconds() - other.total_nanoseconds()
return timespec(*divmod(ns_diff, 10 ** 9))
def __str__(self):
if self.sec < 0 and self.nsec:
sec = abs(1 + self.sec)
nsec = 10**9 - self.nsec
return '-%i.%09u' % (sec, nsec)
else:
return '%i.%09u' % (self.sec, self.nsec)
def __repr__(self):
return '<timespec(%s, %s)>' % (self.sec, self.nsec)
Der timespec-Typ ähnelt dem Format (E) von Tupeln ganzer Zahlen, mit dem Unterschied, dass er Arithmetik und Konvertierung in Float unterstützt.
Der timespec-Typ wurde abgelehnt, da er nur Nanosekundenauflösung unterstützt und jede arithmetische Operation implementiert werden muss, während der Decimal-Typ bereits implementiert und gut getestet ist.
Alternativen: API-Design
Fügen Sie ein String-Argument hinzu, um den Rückgabetyp anzugeben
Fügen Sie ein String-Argument zu Funktionen hinzu, die Zeitstempel zurückgeben, z. B.: time.time(format=”datetime”). Ein String ist erweiterbarer als ein Typ: Es ist möglich, ein Format anzufordern, das keinen Typ hat, wie z. B. ein Tupel aus ganzen Zahlen.
Diese API wurde abgelehnt, da sie implizit Module importieren musste, um Objekte zu instanziieren (z. B. import datetime, um datetime.datetime zu erstellen). Der Import eines Moduls kann eine Ausnahme auslösen und langsam sein, ein solches Verhalten ist unerwartet und überraschend.
Fügen Sie ein globales Flag hinzu, um den Zeitstempeltyp zu ändern
Ein globales Flag wie os.stat_decimal_times(), ähnlich wie os.stat_float_times(), kann hinzugefügt werden, um den Zeitstempeltyp global festzulegen.
Ein globales Flag kann Probleme mit Bibliotheken und Anwendungen verursachen, die Decimal anstelle von Float erwarten. Decimal ist nicht vollständig kompatibel mit Float. float+Decimal löst beispielsweise einen TypeError aus. Der Fall os.stat_float_times() ist anders, da ein int in Float konvertiert werden kann und int+float float ergibt.
Fügen Sie ein Protokoll zum Erstellen eines Zeitstempels hinzu
Anstatt zu hart codieren, wie Zeitstempel erstellt werden, kann ein neues Protokoll zum Erstellen eines Zeitstempels aus einem Bruch hinzugefügt werden.
Beispielsweise würde time.time(timestamp=type) die Klassenmethode type.__fromfraction__(numerator, denominator) aufrufen, um ein Zeitstempelobjekt vom angegebenen Typ zu erstellen. Wenn der Typ das Protokoll nicht unterstützt, wird ein Fallback verwendet: type(numerator) / type(denominator).
Eine Variante ist die Verwendung eines „Konverter“-Callbacks zum Erstellen eines Zeitstempels. Beispiel für die Erstellung eines Float-Zeitstempels
def timestamp_to_float(numerator, denominator):
return float(numerator) / float(denominator)
Gemeinsame Konverter können von den Modulen time, datetime und anderen bereitgestellt werden, oder vielleicht ein spezielles „hires“-Modul. Benutzer können ihre eigenen Konverter definieren.
Ein solches Protokoll hat eine Einschränkung: Die Zeitstempelstruktur muss einmal festgelegt werden und kann später nicht mehr geändert werden. Beispielsweise würde das Hinzufügen einer Zeitzone oder des absoluten Startpunkts des Zeitstempels die API brechen.
Der Protokollvorschlag wurde als übertrieben für die Anforderungen angesehen, aber die vorgeschlagene spezifische Syntax (time.time(timestamp=type)) erlaubt es, dies später einzuführen, wenn zwingende Anwendungsfälle entdeckt werden.
Hinweis
Andere Formate können anstelle eines Bruchs verwendet werden: siehe beispielsweise den Abschnitt Tupel aus ganzen Zahlen.
Fügen Sie neue Felder zu os.stat hinzu
Um die Erstellungs-, Änderungs- und Zugriffszeit einer Datei mit Nanosekundenauflösung zu erhalten, können drei Felder zur os.stat()-Struktur hinzugefügt werden.
Die neuen Felder können Zeitstempel mit Nanosekundenauflösung sein (z. B. Decimal) oder der Nanosekundenteil jedes Zeitstempels (int).
Wenn die neuen Felder Zeitstempel mit Nanosekundenauflösung sind, wäre das Befüllen der zusätzlichen Felder zeitaufwändig. Jeder Aufruf von os.stat() wäre langsamer, auch wenn os.stat() nur aufgerufen wird, um zu prüfen, ob eine Datei existiert. Ein Parameter kann zu os.stat() hinzugefügt werden, um diese Felder optional zu machen, die Struktur hätte eine variable Anzahl von Feldern.
Wenn die neuen Felder nur den Bruchteil (Nanosekunden) enthalten, wäre os.stat() effizient. Diese Felder wären immer vorhanden und somit auf Null gesetzt, wenn das Betriebssystem keine Untersekundenauflösung unterstützt. Das Aufteilen eines Zeitstempels in zwei Teile, Sekunden und Nanosekunden, ähnelt dem timespec-Typ und dem Tupel aus ganzen Zahlen und hat somit dieselben Nachteile.
Das Hinzufügen neuer Felder zur os.stat()-Struktur löst das Nanosekundenproblem in anderen Modulen (z. B. im time-Modul) nicht.
Fügen Sie ein boolesches Argument hinzu
Da wir nur einen neuen Typ (Decimal) benötigen, kann ein einfaches boolesches Flag hinzugefügt werden. Beispiel: time.time(decimal=True) oder time.time(hires=True).
Ein solches Flag würde einen versteckten Import erfordern, was als schlechte Praxis gilt.
Die boolesche Argument-API wurde abgelehnt, da sie nicht „pythonisch“ ist. Die Änderung des Rückgabetyps mit einem Parameterwert wird einem booleschen Parameter (einem Flag) vorgezogen.
Fügen Sie neue Funktionen hinzu
Fügen Sie neue Funktionen für jeden Typ hinzu, Beispiele
- time.clock_decimal()
- time.time_decimal()
- os.stat_decimal()
- os.stat_timespec()
- usw.
Das Hinzufügen einer neuen Funktion für jede Funktion, die Zeitstempel erstellt, dupliziert viel Code und wäre eine Wartungsqual.
Fügen Sie ein neues Modul namens hires hinzu
Fügen Sie ein neues Modul namens „hires“ mit derselben API wie das time-Modul hinzu, mit dem Unterschied, dass es Zeitstempel mit hoher Auflösung zurückgibt, z. B. decimal.Decimal. Das Hinzufügen eines neuen Moduls vermeidet die Verknüpfung von Low-Level-Modulen wie time oder os mit dem decimal-Modul.
Diese Idee wurde abgelehnt, da sie die meisten Codes des time-Moduls duplizieren müsste, eine Wartungsqual wäre und Zeitstempel in anderen Modulen als time verwendet werden. Beispiele: signal.sigtimedwait(), select.select(), resource.getrusage(), os.stat() usw. Das Duplizieren des Codes jedes Moduls ist nicht akzeptabel.
Links
Python
- Issue #7652: Merge C version of decimal into py3k (cdecimal)
- Issue #11457: os.stat(): add new fields to get timestamps as Decimal objects with nanosecond resolution
- Issue #13882: PEP 410: Use decimal.Decimal type for timestamps
- [Python-Dev] Store timestamps as decimal.Decimal objects
Andere Sprachen
- Ruby (1.9.3), die Time-Klasse unterstützt Pikosekunden (10-12)
- .NET Framework, DateTime-Typ: Anzahl von 100-Nanosekunden-Intervallen, die seit dem 12:00:00 Uhr am 1. Januar 0001 vergangen sind. DateTime.Ticks verwendet eine signierte 64-Bit-Ganzzahl.
- Java (1.5), System.nanoTime(): Wanduhr mit einem unbestimmten Startpunkt als Anzahl von Nanosekunden, verwendet eine signierte 64-Bit-Ganzzahl (long).
- Perl, Time::HiRes-Modul: verwendet float, hat also dasselbe Präzisionsverlustproblem mit Nanosekundenauflösung wie Python-Float-Zeitstempel
Urheberrecht
Dieses Dokument wurde gemeinfrei erklärt.
Quelle: https://github.com/python/peps/blob/main/peps/pep-0410.rst
Zuletzt geändert: 2025-02-01 08:59:27 GMT