Python Find the N adjacent digits in the 1000-digit number that have the greatest product This question was presented to me, adapted from Project Euler #8.  The goal is to find the N adjacent digits in the 1000-digit number that have the greatest product.  Range of N: 10 &lt;= N &lt;= 50.  Not only I have to find the max product of 13 consecutive digits in a sequence, I also had to find the max product of 19, 35, 46. This is really no biggie, just scaling up from the previous 13. Anyway, I set out to code two solutions, one which is done by a generator ( I love these efficient things, so useful in Project Euler) and another which I would describe it as code I written before I knew about generators.

Code 1 (Generator):


  number=7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450


def largestproduct(adjdigit):
    x=0
    y=adjdigit
    z=str(number)[x:y]
    product=1
    count=0
    while y&lt;=1000:
        for i in z:
            if count==adjdigit:
                yield product
                product=1
                count=0
                x+=1
                y+=1
                z=str(number)[x:y]
            product*=int(i)
            count+=1
print(max(largestproduct(13)))


Code 2 (Non-generator):


  number=7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450


def largestproduct(adjdigit):
    x=0
    y=adjdigit
    z=str(number)[x:y]
    product=1
    count=0
    control=0
    while y&lt;=1000:
        for i in z:
            if count==adjdigit:
                if product&gt;control:
                    control=product
                product=1
                count=0
                x+=1
                y+=1
                z=str(number)[x:y]

            product*=int(i)
            count+=1
    return control
print(largestproduct(19))


Which one would be better and more efficient to use? To me, generators are always the best due to them lacking the need to occupy tons of space in memory when processing large amounts of data. Oh and please suggest improvements, and cool functions and tools that can be useful from other Python packages.
Review

Yes the first option would be better as memory might become an issue with really long numbers (say you have a 10 million length number). But that implementation could be improved as well


Your first solution does not return the max product but rather a list generator of products. This is confusing!
Chop up your code into functions, as it makes it easier to test/change things


The problem can be divided into to 3 seperate functions:


Cut a big number into evenly sized chunks of adjacent digits
Sum the product of the chunks
A main function that returns the largest adjecent product


Alternative Code

from functools import reduce
import operator

def cut_adj_chunks(iterable, chunk_size):
    for i in range(len(iterable) - chunk_size):
        yield iterable[i:i+chunk_size]

def sum_prod(num_str):
    num_list = map(int, num_str)
    return reduce(operator.mul, num_list, 1)

def largest_prod(adj_digits, big_num):
    return max(sum_prod(chunk) for chunk in cut_adj_chunks(str(big_num), adj_digits))