¿Por qué time.clock da un mayor tiempo transcurrido que time.time?

Programé una sección del código de Python en Ubuntu usando time.clock y time.time :

 clock elapsed time: 8.770 s time elapsed time: 1.869 s 

Entiendo que time.time usa la hora del sistema y time.clock usa el reloj del procesador. Tiene sentido para mí cuando time.time da un tiempo transcurrido mayor que time.clock: el procesador simplemente no estuvo activo todo el tiempo (por ejemplo, el tiempo de una llamada a time.sleep ).

Pero, ¿por qué / cuándo el reloj del procesador da un tiempo transcurrido mucho mayor que el tiempo del sistema?


apéndice

Hice una prueba aproximada calculando la misma función con un mapa estándar, con un mapa de grupo de procesos y un mapa de grupo de hilos. Comprensiblemente, el grupo de procesos es más rápido y el grupo de subprocesos es más lento. Más interesante: el tiempo de reloj es menor que el tiempo con el grupo de procesadores pero mayor en el grupo de subprocesos.

De nuevo, entiendo por qué la sincronización del reloj es menor con el grupo de procesadores: probablemente el proceso maestro no hace mucho y solo espera a que se completen los procesos del grupo. Pero, ¿por qué el reloj está sincronizando más con el conjunto de hilos? ¿Alguna idea?

Resultados:

 map time 1738.8 clock 1739.6 mp pool time 580.1 clock 15.9 thread pool time 3455.3 clock 5378.9 

Código:

 from time import clock, sleep, time from multiprocessing.pool import ThreadPool from multiprocessing import Pool import random def f(i): x = [random.random() for j in range(100000)] return x[i] def t(fn): t0, c0 = time(), clock() for i in range(10): fn(f,range(16)) print ' time ', round(1000*(time()-t0),1) print ' clock', round(1000*(clock()-c0),1) if __name__ == '__main__': print 'map' t(map) pool = Pool(8) print 'mp pool' t(pool.map) pool = ThreadPool(8) print 'thread pool' t(pool.map) 

El tiempo de CPU puede exceder el tiempo de pared si se ejecuta en varias CPU. No he visto esto específicamente en Python, pero definitivamente lo he visto cuando uso la función de clock con varios subprocesos de C, y probablemente el código de Python simplemente está llamando directamente a esta función de C.

Respecto al “por qué”: lo estás pensando de manera incorrecta. Lo importante es cuántos núcleos están ejecutando su progtwig. Si un núcleo se ejecuta durante un segundo en el transcurso de dos segundos de tiempo en la pared, tiene sentido para usted, pero, ¿y si cuatro núcleos se ejecutan durante un segundo en ese mismo intervalo de tiempo? Luego tienes 4 segundos de tiempo de CPU en 2 segundos de tiempo de pared. El kernel cuenta para el tiempo de CPU que mide todos los núcleos. Si se ejecutan varios núcleos durante el mismo segundo, se gastan varios segundos de CPU durante ese segundo. Esa es la medida del costo que le importa al progtwigdor, y presumiblemente esa es la métrica sobre la que se construye el clock . Puede que esta no sea la métrica que le interesa, pero así es como funciona.