以下のことをより簡潔、効率的、または単純に Python で実行する方法はありますか?
def product(lst):
p = 1
for i in lst:
p *= i
return p
いくつかのテストを行った結果、以下を使用するよりもわずかに高速であることがわかりましたoperator.mul
。
from operator import mul
# from functools import reduce # python3 compatibility
def with_lambda(lst):
reduce(lambda x, y: x * y, lst)
def without_lambda(lst):
reduce(mul, lst)
def forloop(lst):
r = 1
for x in lst:
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)
ベストアンサー1
ラムダを使用しない場合:
from operator import mul
# from functools import reduce # python3 compatibility
reduce(mul, list, 1)
より良く、より速くなりました。Python 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.34ミリ秒 3.51ミリ秒 16.7マイクロ秒 38.9マイクロ秒 D 46.6ミリ秒 38.5ミリ秒 180マイクロ秒 216マイクロ秒
結果:データ構造としてnp.prod
使用する場合、最も高速ですnp.array
(小さな配列の場合は 18 倍、大きな配列の場合は 250 倍)
Python 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.79ミリ秒 3.74ミリ秒 18.6マイクロ秒 40.9マイクロ秒 D 48.4 ミリ秒 36.8 ミリ秒 187 マイクロ秒 214 マイクロ秒
Python 3 は遅いですか?