No trate de optimizar antes de referencia.
Teniendo esto en cuenta, es cierto que todas las expresiones se evaluarán incluso si un término intermedio es cero.
El pedido puede seguir siendo importante. Las expresiones son evaluated from left to right. Si a,b,c,...
son números muy grandes, podrían forzar a Python a asignar mucha memoria, ralentizando el cálculo antes de llegar al j=0
. (Si j=0
apareció antes en la expresión, entonces el producto nunca sería tan grande y no se necesitaría ninguna asignación de memoria adicional).
Si, después de tiempo de su código con timeit o cProfile, cree que esto puede ser su situación, entonces usted podría tratar de pre-evaluación c,d,k,j
, y prueba de
if not all (c,d,k,j):
expression = 0
else:
expression = a*b*c*d*....*w
Luego el tiempo esto con timeit
o cProfile
y . La única forma de saber realmente si esto es útil en su situación es realizar una evaluación comparativa.
In [333]: import timeit
In [334]: timeit.timeit('10**100*10**100*0')
Out[334]: 1.2021231651306152
In [335]: timeit.timeit('0*10**100*10**100')
Out[335]: 0.13552498817443848
Aunque PyPy es mucho más rápido, que no parece para optimizar este sea:
% pypy-c
Python 2.7.3 (d994777be5ab, Oct 12 2013, 14:13:59)
[PyPy 2.2.0-alpha0 with GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
And now for something completely different: ``http://twitpic.com/52ae8f''
>>>> import timeit
>>>> timeit.timeit('10**100*10**100*0')
0.020643949508666992
>>>> timeit.timeit('0*10**100*10**100')
0.003732919692993164
¿Cómo explicar la última sincronización de Baldur? –