Is there a built-in product() in Python?

PythonListProduct

Python Problem Overview


I've been looking through a tutorial and book but I can find no mention of a built in product function i.e. of the same type as sum(), but I could not find anything such as prod().

Is the only way I could find the product of items in a list by importing the mul() operator?

Python Solutions


Solution 1 - Python

Pronouncement

Yes, that's right. Guido rejected the idea for a built-in prod() function because he thought it was rarely needed.

Python 3.8 Update

In Python 3.8, prod() was added to the math module:

>>> from math import prod
>>> prod(range(1, 11))
3628800

Alternative with reduce()

As you suggested, it is not hard to make your own using reduce() and operator.mul():

def prod(iterable):
    return reduce(operator.mul, iterable, 1)

>>> prod(range(1, 5))
24

In Python 3, the reduce() function was moved to the functools module, so you would need to add:

from functools import reduce

Specific case: Factorials

As a side note, the primary motivating use case for prod() is to compute factorials. We already have support for that in the math module:

>>> import math

>>> math.factorial(10)
3628800

Alternative with logarithms

If your data consists of floats, you can compute a product using sum() with exponents and logarithms:

>>> from math import log, exp

>>> data = [1.2, 1.5, 2.5, 0.9, 14.2, 3.8]
>>> exp(sum(map(log, data)))
218.53799999999993

>>> 1.2 * 1.5 * 2.5 * 0.9 * 14.2 * 3.8
218.53799999999998

Solution 2 - Python

There is no product in Python, but you can define it as

def product(iterable):
    return reduce(operator.mul, iterable, 1)

Or, if you have NumPy, use numpy.product.

Solution 3 - Python

Since the reduce() function has been moved to the module functools python 3.0, you have to take a different approach.

You can use functools.reduce() to access the function:

product = functools.reduce(operator.mul, iterable, 1)

Or, if you want to follow the spirit of the python-team (which removed reduce() because they think for would be more readable), do it with a loop:

product = 1
for x in iterable:
    product *= x

Solution 4 - Python

from numpy import multiply, product
list1 = [2,2,2]
list2 = [2,2,2]
mult = 3
prod_of_lists = multiply(list1,list2)
>>>[4,4,4]
prod_of_list_by_mult = multiply(list1,mult)
>>>[6,6,6]
prod_of_single_array = product(list1)
>>>8

numpy has many really cool functions for lists!

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionGeorge BurrowsView Question on Stackoverflow
Solution 1 - PythonRaymond HettingerView Answer on Stackoverflow
Solution 2 - PythonFred FooView Answer on Stackoverflow
Solution 3 - PythonPaul PaulsenView Answer on Stackoverflow
Solution 4 - PythonHuntR2View Answer on Stackoverflow