Не пытайтесь оптимизировать, прежде чем тестировать.
Имея это в виду, верно, что все выражения будут оцениваться, даже если промежуточный член равен нулю.
Заказ все еще может иметь значение. Выражения оцениваются слева направо . Если a,b,c,...
очень большие числа, они могут заставить Python выделять много памяти, замедляя вычисления до того, как они достигнут j=0
. (Если бы j=0
появилось раньше в выражении, то продукт никогда не получился бы таким большим, и не потребовалось бы дополнительное выделение памяти).
Если после синхронизации вашего кода с timeit или cProfile вы чувствуете, что это может быть вашей ситуацией, тогда вы можете попробовать предварительно оценить c,d,k,j
и протестировать
if not all (c,d,k,j):
expression = 0
else:
expression = a*b*c*d*....*w
Затем отметьте это также timeit
или cProfile
. Единственный способ действительно определить, насколько это полезно в вашей ситуации, - это сравнительный анализ.
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
Несмотря на то, что PyPy работает намного быстрее, он также не оптимизирует это:
% 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