다음을 수행하는 더 간결하고 효율적이거나 단순한 파이썬 방법이 있습니까?
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)
답변
람다를 사용하지 않고 :
from operator import mul
reduce(mul, list, 1)
더 좋고 빠릅니다. 파이썬 2.7.5로
from operator import mul
import numpy as np
import numexpr as ne
# from functools import reduce # python3 compatibility
a = range(1, 101)
%timeit reduce(lambda x, y: x * y, a) # (1)
%timeit reduce(mul, a) # (2)
%timeit np.prod(a) # (3)
%timeit ne.evaluate("prod(a)") # (4)
다음 구성에서 :
a = range(1, 101) # A
a = np.array(a) # B
a = np.arange(1, 1e4, dtype=int) #C
a = np.arange(1, 1e5, dtype=float) #D
Python 2.7.5의 결과
| 1 | 2 | 3 | 4 | ------- + ----------- + ----------- ++ ---------- + ------ ----- + 20.8 µs 13.3 µs 22.6 µs 39.6 µs B 106 µs 95.3 µs 5.92 µs 26.1 µs C 4.34ms 3.51ms 16.7µs 38.9µs D 46.6ms 38.5ms 180µs 216µs
결과 : 데이터 구조로 np.prod
사용 np.array
하는 경우 가장 빠릅니다 (작은 배열의 경우 18x, 큰 배열의 경우 250x).
파이썬 3.3.2로 :
| 1 | 2 | 3 | 4 | ------- + ----------- + ----------- ++ ---------- + ------ ----- + 23.6 µs 12.3 µs 68.6 µs 84.9 µs B 133µs 107µs 7.42µs 27.5µs C 4.79ms 3.74ms 18.6µs 40.9µs D 48.4ms 36.8ms 187µs 214µs
파이썬 3이 느려 집니까?
답변
reduce(lambda x, y: x * y, list, 1)
답변
목록에 숫자 만있는 경우 :
from numpy import prod
prod(list)
편집 : @ off99555에 의해 지적 된대로 이것은 큰 정수 결과에 대해 작동하지 않습니다.이 경우 numpy.int64
Ian Clelland의 솔루션을 기반으로 operator.mul
하고 reduce
큰 정수 결과에 대해 반환하는 동안 형식 결과를 반환합니다 long
.
답변
실제로 가져 오기없이 한 줄로 만들고 싶다면 다음을 수행하십시오.
eval('*'.join(str(item) for item in list))
그러나하지 마십시오.
답변
import operator
reduce(operator.mul, list, 1)
답변
시작 Python 3.8
하여 prod
함수가 math
표준 라이브러리 의 모듈에 포함되었습니다 .
math.prod (iterable, *, start = 1)
start
iterable 숫자 의 값 (기본값 : 1) 곱의 곱을 반환합니다 .
import math
math.prod([2, 3, 4]) # 24
iterable이 비어 있으면 1
(또는 start
제공된 경우 값) 생성됩니다.
답변
comp.lang.python (죄송하지만 포인터를 생성하기에는 너무 게으르다)에 대한 오랜 토론을 기억 하며 원래 product()
정의가 가장 Pythonic 이라고 결론 내 렸습니다 .
제안은 당신이 그것을 원할 때마다 for 루프를 작성하는 것이 아니라 함수를 한 번 (축소 유형별로) 작성하고 필요에 따라 호출하는 것입니다! 축소 함수를 호출하는 것은 매우 Pythonic입니다. 생성기 표현식과 잘 작동하며,을 성공적으로 도입 한 sum()
이후 Python은 점점 더 기본 제공되는 축소 함수를 계속 증가 any()
시키고 all()
있습니다.
이 결론은 좀 공식입니다 – reduce()
한 제거 말, 파이썬 3.0에 내장 명령에서 :
”
functools.reduce()
실제로 필요한 경우 사용하십시오 . 그러나 명시 적 for 루프가 더 읽기 쉬운 시간의 99 %입니다.”
Guido의 지원 인용문 및 해당 블로그를 읽는 Lispers의 의견이 적지 않은 내용은 Python 3000의 reduce () 운명을 참조하십시오 .
우연히 product()
조합론 이 필요한 경우 PS math.factorial()
(신규 2.6)를 참조하십시오 .
