Когда есть много способов что-то сделать, я обращаюсь к таким критериям, как удобочитаемость или скорость, чтобы решить, какой код использовать. Вот некоторый код, который предполагает, что use_loop
и use_reduce
примерно связаны с точки зрения скорости (по крайней мере, для протестированных значений!)
import operator
import itertools
a=range(1,1000)
def use_loop(a,n):
result=1
for num in a[:n]:
result*=num
return result
def use_reduce(a,n):
return reduce(operator.mul, a[:n])
def use_reduce_lambda(a,n):
return reduce(lambda x,y: x*y, a[:n])
def use_islice_loop(a,n):
result=1
for num in itertools.islice(a,n):
result*=num
return result
def use_islice_reduce(a,n):
return reduce(operator.mul, itertools.islice(a,n))
if __name__=='__main__':
n=50
print(use_loop(a,n))
print(use_reduce(a,n))
print(use_reduce_lambda(a,n))
print(use_islice_loop(a,n))
print(use_islice_reduce(a,n))
Вот результаты синхронизации:
% python -mtimeit -s"import test" "test.use_loop(test.a,50)"
10000 loops, best of 3: 16.1 usec per loop
% python -mtimeit -s"import test" "test.use_reduce(test.a,50)"
100000 loops, best of 3: 16.3 usec per loop
% python -mtimeit -s"import test" "test.use_islice_loop(test.a,50)"
10000 loops, best of 3: 19.6 usec per loop
% python -mtimeit -s"import test" "test.use_islice_reduce(test.a,50)"
10000 loops, best of 3: 19.2 usec per loop
% python -mtimeit -s"import test" "test.use_reduce_lambda(test.a,50)"
10000 loops, best of 3: 32.1 usec per loop
По крайней мере для проверенных значений a
(1000) и n
(50), itertools.islice
, по-видимому, не влияет на производительность. use_reduce_lambda
был значительно медленнее, чем его двоюродный брат use_reduce
, который использовал operator.mul
. Однако время, необходимое для импорта operator
, не было включено в тест.
Поскольку use_loop
и use_reduce
кажутся одинаково быстрыми, я бы предложил использовать reduce
, поскольку его короткий идиоматический код должен быть вполне читабельным для большинства программистов на Python. Тем не менее, в вопросах вкуса я не думаю, что стоит быть слишком самоуверенным. Выберите то, что вам больше нравится, просто будьте последовательны.
PS. Начиная с Python 3+, reduce
больше не является встроенной функцией, но к ней можно получить доступ через functools.reduce
.