import random
import time
import sys


def printf(format, *args):
    sys.stdout.write(format % args)

zz = []

# a list is printed only if it contains less than printlim values
printlim = 12

def generate( n ):
    global zz
    random.seed(1234321)
    t1 = time.time()
    zz = list(range(n))
    random.shuffle(zz)
    t2 = time.time()
    # printf("time shuffling %f\n", t2-t1  )
    if n < printlim: print(zz)


# --------------------------------------------------
# Deleting INSIDE an array/list is
#    -- convenient and comfortable,
#    -- sometimes completely unnecessary,
#    -- dangerously slow.

# --------------------------------------------------
# Deleting AT THE BEGINNING of an the array/list is
#    -- highly convenient and comfortable,
#    -- quite natural in many situations,
#    -- the slowest of all possible delete operations.

# --------------------------------------------------
# Manipulate the list size n to see varying results.
n = 10**6
n = 10000
n = 10000

printf( "List length = %d \n\n", n )

# --------------------------------------------------
# Switch on/off by setting if True: / if False:
# appropriate parts of the demonstration

if True:
    # delete at the END -- FAST
    print("delete at end")
    generate( n )
    t1 = time.time()
    for i in range( len(zz) ):
        del( zz[-1] ) # del last elem
        if n < printlim: print( zz )
    t2 = time.time()
    printf("time %f\n", t2-t1  )

if True:
    # delete close to the END -- FAST
    print("delete close to end")
    generate( n )
    t1 = time.time()
    for i in range( len(zz)-10 ):
        del( zz[-10] ) # del last elem
        if n < printlim: print( zz )
    t2 = time.time()
    printf("time %f\n", t2-t1  )

if True:
    # delete at the BEGINNING -- SLOW
    print("delete beginning")
    generate( n )
    t1 = time.time()
    for i in range( len(zz) ):
        del( zz[0] ) # del 1st elem
        if n < printlim: print( zz )
    t2 = time.time()
    printf("time %f\n", t2-t1  )

if True:
    # delete SOMEWHERE INSIDE -- EXTREMELY SLOW, LINEAR COMPLEXITY
    print("delete random inside with remove")
    generate( n )
    t1 = time.time()
    for i in range( len(zz) ):
        zz.remove( i )
        if n < printlim: print( zz )
    t2 = time.time()
    printf("time %f\n", t2-t1  )

if True:
    # delete in the middle -- FAST??
    print("delete in the middle with del")
    generate( n )
    t1 = time.time()
    w = len(zz)
    for i in range( w  ):
        del( zz[ (len(zz) // 2)] ) # del middle elem
        if n < printlim: print( zz )
    t2 = time.time()
    printf("time %f\n", t2-t1  )

if True:
    # delete in the middle -- FAST??
    print("delete in the middle with remove")
    generate( n )
    t1 = time.time()
    w = len(zz)
    for i in range( w  ):
        zz.remove(zz[len(zz) // 2]) # del middle elem
        if n < printlim: print( zz )
    t2 = time.time()
    printf("time %f\n", t2-t1  )

'''
Generate a suitable sequence from OEIS:
About OEIS:
https://www.theguardian.com/science/alexs-adventures-in-numberland/2014/oct/07/neil-sloane-the-man-who-loved-only-integer-sequences

'''

