web-dev-qa-db-fra.com

Obtenez le temps POSIX / Unix en secondes et nanosecondes en Python?

J'essaie de trouver un moyen d'obtenir l'heure depuis 1970-01-01 00:00:00 UTC en secondes et nanosecondes en python et je ne trouve rien qui puisse me donner le bonne précision.

J'ai essayé d'utiliser le module de temps, mais cette précision n'est qu'en microsecondes, donc le code que j'ai essayé était:

import time

print time.time()

ce qui m'a donné un résultat comme celui-ci:

1267918039.01

Cependant, j'ai besoin d'un résultat qui ressemble à ceci:

1267918039.331291406

Quelqu'un connaît-il un moyen possible d'exprimer le temps UNIX en secondes et en nanosecondes? Je n'arrive pas à trouver un moyen de définir la précision appropriée ou d'obtenir un résultat au format correct. Merci pour toute aide

39
Bill

Votre précision vient d'être perdue en raison du formatage des chaînes:

>>> import time
>>> print "%.20f" % time.time()
1267919090.35663390159606933594
36
MattH

Puisque Python 3.7 il est facile à réaliser avec time.time_ns()

Similaire à time() mais renvoie le temps sous la forme d'un nombre entier de nanosecondes depuis l'époque.

Toutes les nouvelles fonctionnalités qui incluent les nanosecondes dans Python 3.7 version: PEP 564: Ajouter de nouvelles fonctions temporelles avec une résolution en nanosecondes

12
vishes_shell

Le problème est probablement lié à votre système d'exploitation, pas à Python. Voir la documentation du module time: http://docs.python.org/library/time.html

time.time()

Renvoie l'heure sous forme de nombre à virgule flottante exprimé en secondes depuis l'Époque, en UTC. Notez que même si l'heure est toujours renvoyée sous forme de nombre à virgule flottante, tous les systèmes ne fournissent pas l'heure avec une meilleure précision qu'une seconde . Bien que cette fonction renvoie normalement des valeurs non décroissantes, elle peut renvoyer une valeur inférieure à un appel précédent si l'horloge système a été réglée entre les deux appels.

En d'autres termes: si votre système d'exploitation ne peut pas le faire, Python ne peut pas le faire. Vous pouvez multiplier la valeur de retour par l'ordre de grandeur approprié afin d'obtenir la valeur en nanosecondes, cependant aussi imprécis que cela puisse être.

EDIT: Le retour est une variable flottante, donc le nombre de chiffres après la virgule variera, que votre système d'exploitation ait ce niveau de précision ou non. Vous pouvez le formater avec "%.nf"n est le nombre de chiffres que vous voulez, cependant, si vous voulez une représentation sous forme de chaîne à virgule fixe.

9
Alan Plum

Cela dépend du type d'horloge et de votre système d'exploitation et de votre matériel, que vous puissiez ou non obtenir une précision en nanosecondes pas du tout. Depuis la documentation du module time :

La précision des différentes fonctions en temps réel peut être inférieure à celle suggérée par les unités dans lesquelles leur valeur ou argument est exprimé. Par exemple. sur la plupart des systèmes Unix, l'horloge ne "coche" que 50 ou 100 fois par seconde.

Sur Python 3, le module time vous donne accès à 5 types d'horloge différents, chacun avec des propriétés différentes; certains d'entre eux peuvent vous offre un chronométrage de précision en nanosecondes. Utilisez la fonction time.get_clock_info() pour voir les caractéristiques de chaque horloge et le temps de précision indiqué.

Sur mon ordinateur portable OS X 10.11, les fonctionnalités disponibles sont les suivantes:

>>> for name in ('clock', 'monotonic', 'perf_counter', 'process_time', 'time'):
...     print(name, time.get_clock_info(name), sep=': ')
...
clock: namespace(adjustable=False, implementation='clock()', monotonic=True, resolution=1e-06)
monotonic: namespace(adjustable=False, implementation='mach_absolute_time()', monotonic=True, resolution=1e-09)
perf_counter: namespace(adjustable=False, implementation='mach_absolute_time()', monotonic=True, resolution=1e-09)
process_time: namespace(adjustable=False, implementation='getrusage(RUSAGE_SELF)', monotonic=True, resolution=1e-06)
time: namespace(adjustable=True, implementation='gettimeofday()', monotonic=False, resolution=1e-06)

donc utiliser les fonctions time.monotonic() ou time.perf_counter() me donnerait théoriquement une résolution en nanosecondes. Aucune des deux horloges ne me donne l'heure du mur, seulement le temps écoulé; les valeurs sont par ailleurs arbitraires. Ils sont cependant utiles pour mesurer combien de temps quelque chose a pris.

6
Martijn Pieters

Il est peu probable que vous obteniez réellement une précision en nanosecondes à partir d'une machine actuelle.

La machine ne peut pas créer de précision et afficher des chiffres significatifs lorsque cela n'est pas approprié n'est pas la bonne chose à faire.

4
janm

Je ne pense pas qu'il existe un moyen indépendant de la plate-forme (peut-être qu'un tiers en a codé un, mais je ne le trouve pas) pour obtenir du temps en nanosecondes; vous devez le faire d'une manière spécifique à la plate-forme. Par exemple, cette SO question la réponse montre comment le faire sur une plate-forme qui fournit un librt.so bibliothèque système pour les opérations "en temps réel".

2
Alex Martelli