リストの積を返す 質問する

リストの積を返す 質問する

以下のことをより簡潔、効率的、または単純に 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 は遅いですか?

おすすめ記事