以下を実行するためのより簡潔で効率的な、または単にpythonicな方法はありますか?
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、変数名として使用しないように編集したくなります...
+そのタイプのリストのアイデンティティー要素であると言います(同様に製品/の場合*)。Pythonが動的に型付けされているために物事が困難になっていることがわかりましたが、これはHaskellのような静的型システムを使用する正気な言語で解決された問題です。しかし、とにかく機能しないので、とにかく数で作業Pythonすることsumを許可するだけなsum(['a', 'b'])ので、私は再びそれ0が製品にとって意味があるsumと言い1ます。

reduce回答がを上げるのTypeErrorに対して、ここで指定されたオプションには機能的な違いがありますが、forループの回答は1を返します。これはforループの回答のバグです(空のリストの積は1にすぎず、17です)または「armadillo」)。