Comparé estas dos funciones (descomprimen los pares nuevamente en las listas de fuentes, provienen de aquí ):
n = 10**7 a = list(range(n)) b = list(range(n)) pairs = list(zip(a, b)) def f1(a, b, pairs): a[:], b[:] = zip(*pairs) def f2(a, b, pairs): for i, (a[i], b[i]) in enumerate(pairs): pass Resultados con timeit.timeit (cinco rondas, los números son segundos):
f1 1.06 f2 1.57 f1 0.96 f2 1.69 f1 1.00 f2 1.85 f1 1.11 f2 1.64 f1 0.95 f2 1.63 Claramente, f1 es mucho más rápido que f2 , ¿verdad?
Pero luego también medí con timeit.default_timer y obtuve una imagen completamente diferente:
f1 7.28 f2 1.92 f1 5.34 f2 1.66 f1 6.46 f2 1.70 f1 6.82 f2 1.59 f1 5.88 f2 1.63 Así que claramente f2 es mucho más rápido, ¿verdad?
Suspiro. ¿Por qué los tiempos difieren totalmente de esa manera y qué método de tiempo debo creer?
Código de referencia completo:
from timeit import timeit, default_timer n = 10**7 a = list(range(n)) b = list(range(n)) pairs = list(zip(a, b)) def f1(a, b, pairs): a[:], b[:] = zip(*pairs) def f2(a, b, pairs): for i, (a[i], b[i]) in enumerate(pairs): pass print('timeit') for _ in range(5): for f in f1, f2: t = timeit(lambda: f(a, b, pairs), number=1) print(f.__name__, '%.2f' % t, end=' ') print() print('default_timer') for _ in range(5): for f in f1, f2: t0 = default_timer() f(a, b, pairs) t = default_timer() - t0 print(f.__name__, '%.2f' % t, end=' ') print()