La siguiente prueba siempre falla (esto se ejecuta en un sistema Linux, la pregunta no es sobre otros sistemas operativos):
from time import time from decimal import Decimal from pathlib import Path def test_timing(): start = Decimal(time()) p = Path(__file__).parent / 'testfile.txt' # does not yet exist p.touch() mt = p.stat().st_mtime p.unlink() # unlinked before the failing assert > assert start <= mt E AssertionError: assert Decimal('1640930671.75709438323974609375') <= 1640930671.7534654La brecha es siempre de 3 a 7 ms.
¿Cómo es posible que Decimal(time()) al inicio devuelva una marca de tiempo posterior al archivo que se crea dos líneas después?
¿Hay una compensación entre las marcas de tiempo de Python y las de Linux? ¿Python continúa creando el archivo antes de que finalice la llamada Decimal(time()) ? ¿Que me estoy perdiendo aqui?
EDITAR: Debería haber mencionado que es un sistema de archivos ext4.
El sistema de archivos ext4 usa current_fs_time para capturar la marca de tiempo del kernel. Para mayor eficiencia, la marca de tiempo del kernel es un valor almacenado en caché, que solo se actualiza a intervalos del programador, que es de aproximadamente 10 ms. Por lo tanto, el tiempo podría tener hasta 10 ms de antigüedad en el momento en que se almacena.
Como nota al margen, no tiene sentido convertir la marca de tiempo a Decimal . El valor de C es un doble, que solo tiene alrededor de 17 dígitos. Eso significa que llegas a microsegundos. Convertir a Decimal no le da ninguna precisión adicional; los otros dígitos son esencialmente aleatorios.