Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get the length of an itertools.product?

Tags:

I am using itertools to run a numerical simulation iterating over all possible combinations of my input parameters. In the example below, I have two parameters and six possible combinations:

import itertools  x = [0, 1] y = [100, 200, 300]  myprod = itertools.product(x, y)  for p in myprod:     print p[0], p[1]     # run myfunction using p[0] as the value of x and p[1] as the value of y 

How can I get the size of myprod (six, in the example)? I'd need to print this before the for loop starts.

I understand myprod is not a list. I can calculate len(list(myprod)), but this consumes the iterator so the for loop no longer works.

I tried:

myprod2=copy.deepcopy(myprod) mylength = len(list(myprod2)) 

but this doesn't work, either. I could do:

myprod2=itertools.product(x,y) mylength = len(list(myprod2)) 

but it's hardly elegant and pythonic!

like image 719
Pythonista anonymous Avatar asked Aug 18 '15 13:08

Pythonista anonymous


People also ask

Is Itertools faster than for loops?

That being said, the iterators from itertools are often significantly faster than regular iteration from a standard Python for loop.

What is Islice?

islice() - The islice() function allows the user to loop through an iterable with a start and stop , and returns a generator. map() - The map() function creates an iterable map object that applies a specified transformation to every element in a chosen iterable.

What is count in Itertools?

itertools. count() makes an iterator that returns values that counts up or down infinitely. itertools.count() — Functions creating iterators for efficient looping — Python 3.9.7 documentation.


1 Answers

To implement Kevin's answer for an arbitrary number of source iterables, combining reduce and mul:

>>> import functools, itertools, operator >>> iters = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] >>> functools.reduce(operator.mul, map(len, iters), 1) 27 >>> len(list(itertools.product(*iters))) 27 

Note that this will not work if your source iterables are themselves iterators, rather than sequences, for the same reason your initial attempts to get the length of the itertools.product failed. Python generally and itertools specifically can work in a memory-efficient way with iterators of any length (including infinite!) so finding out lengths up-front isn't really a case it was designed to deal with.

like image 185
jonrsharpe Avatar answered Sep 22 '22 01:09

jonrsharpe