다음을 수행하는 더 간결하고 효율적이거나 단순한 파이썬 방법이 있습니까?
def product(list):
p = 1
for i in list:
p *= i
return p
편집하다:
실제로 이것은 operator.mul을 사용하는 것보다 약간 빠릅니다.
from operator import mul
# from functools import reduce # python3 compatibility
def with_lambda(list):
reduce(lambda x, y: x * y, list)
def without_lambda(list):
reduce(mul, list)
def forloop(list):
r = 1
for x in list:
r *= x
return r
import timeit
a = range(50)
b = range(1,50)#no zero
t = timeit.Timer("with_lambda(a)", "from __main__ import with_lambda,a")
print("with lambda:", t.timeit())
t = timeit.Timer("without_lambda(a)", "from __main__ import without_lambda,a")
print("without lambda:", t.timeit())
t = timeit.Timer("forloop(a)", "from __main__ import forloop,a")
print("for loop:", t.timeit())
t = timeit.Timer("with_lambda(b)", "from __main__ import with_lambda,b")
print("with lambda (no 0):", t.timeit())
t = timeit.Timer("without_lambda(b)", "from __main__ import without_lambda,b")
print("without lambda (no 0):", t.timeit())
t = timeit.Timer("forloop(b)", "from __main__ import forloop,b")
print("for loop (no 0):", t.timeit())
나에게 준다
('with lambda:', 17.755449056625366)
('without lambda:', 8.2084708213806152)
('for loop:', 7.4836349487304688)
('with lambda (no 0):', 22.570688009262085)
('without lambda (no 0):', 12.472226858139038)
('for loop (no 0):', 11.04065990447998)
list
변수 이름으로 사용하지 않도록 편집하고
+
해당 유형의 목록 에 대한 동일성 요소라고 생각합니다 (예 : product / *
). 이제 파이썬이 동적으로 타이핑되어 일이 더 어려워지는 것을 알고 있지만 Haskell과 같은 정적 타입 시스템을 갖춘 정상적인 언어에서는 해결 된 문제입니다. 그러나 Python
단지 수 sum
있기 때문에, 어쨌든 숫자에 대한 작업에 sum(['a', 'b'])
내가 다시 말할 수 있도록, 심지어 일을하지 않습니다 0
에 대한 의미가 있습니다 sum
및 1
제품에 대한.
reduce
답변이 인상이TypeError
반면,for
루프 대답은 1. 반환 이것은의 버그for
가 17보다 루프 응답 (빈리스트의 제품은 더 이상 일하지 않습니다 또는 'armadillo').