I need to pass huge
def f(*args): # defined in foreign module
arguments = tuple(range(10000))
A simple test using a generator:
def gen(): print('Yielding 1') yield 1 print('Yielding 2') yield 2 print('Yielding 3') yield 3 arguments = gen() def f(*args): pass f(*arguments) # Yielding 1 # Yielding 2 # Yielding 3
As you can see from the output, passing
*arguments will actually unpack the whole iterable, since technically, you are telling Python to pass the iterable as individual arguments using the
*arguments syntax. It does not matter that the function definition also uses
*args which makes Python pack the arguments back into a tuple again.
So yeah, you are unpacking the list only to pack it again here. You can avoid this by just passing the list directly.