Traté de comparar estos dos fragmentos y ver cuántas iteraciones se podían hacer en un segundo. Resulta que Julia logra 2.5 millones de iteraciones mientras que Python 4 millones. ¿No se supone que Julia sea más rápida? ¿O tal vez estos dos fragmentos no son equivalentes?
Pitón:
t1 = time.time()
i = 0
while True:
i += 1
if time.time() - t1 >= 1:
break
Julia
function f()
i = 0
t1 = now()
while true
i += 1
if now() - t1 >= Base.Dates.Millisecond(1000)
break
end
end
return i
end
Respuestas:
Esta es una especie de comparación de rendimiento extraño, ya que normalmente se mide el tiempo que lleva calcular algo sustancial, en lugar de ver cuántas iteraciones triviales se pueden hacer en una cierta cantidad de tiempo. Tuve problemas para que sus códigos Python y Julia funcionen, así que modifiqué el código Julia para que funcione y simplemente no ejecuté el código Python. Como señaló @chepner en un comentario, usar
now()
y hacer comparaciones de tiempo conDateTime
objetos es bastante costoso. Latime.time()
función Python solo devuelve un valor de punto flotante. Como resultado, hay una función llamada Juliatime()
que hace exactamente lo mismo:Aquí está el momento de su
f()
función original (modificada para trabajar) en mi sistema:Hizo casi 5 millones de iteraciones antes de que se agotara el tiempo. Como dije, no pude hacer que tu código de Python se ejecutara en mi sistema sin una manipulación significativa (lo cual no me molesté en hacer). Pero aquí hay una versión de
f()
esos usostime()
, que llamaré imaginativamenteg()
:Esta versión hizo 36 millones de iteraciones. ¿Entonces supongo que Julia es más rápida en el looping? ¡Hurra! Bueno, en realidad el trabajo principal en este bucle son las llamadas a
time()
... Julia es más rápida en generar muchastime()
llamadas.¿Por qué es extraño cronometrar esto? Como dije, la mayor parte del trabajo real aquí está llamando
time()
. El resto del ciclo realmente no hace nada. En un lenguaje compilado optimizado, si el compilador ve un ciclo que no hace nada, lo eliminará por completo. Por ejemplo:Woah, cero segundos! ¿Cómo es eso posible? Bueno, echemos un vistazo al código LLVM (algo así como un código de máquina, pero para una máquina imaginaria que se usa como una representación intermedia), esto se reduce a:
El compilador ve el ciclo, descubre que el resultado es el mismo cada vez y simplemente devuelve ese valor constante en lugar de ejecutar el ciclo. Lo cual, por supuesto, lleva cero tiempo.
fuente
Probablemente quieras usar la
time_ns
función en Julia:En mi computadora funciona 10 veces más rápido que Python.
fuente
Bueno, eso no es lo que observo en mi sistema:
Python 3.7.7
Julia 1.4.0:
pero tenga en cuenta que simplemente usar
time
(es decir, comparar números simples) es aún más rápido:fuente
time.perf_counter_ns()
en Python?time_ns
notime
, ya que es ~ 30% más rápido entonces.