Thanks to Toby now the program takes:

--- 7.169409990310669 seconds to finish the program--- instead of --- 186.7168517112732 seconds--- for 100 milion numbers.

One other improvement I made was to add an extra optimization on the random generating algorithm, using numpy. So numpy.sort() was used to sort the numpy array, because it is faster for numpy arrays.

###Code

import time
import numpy

start_time0 = time.time()

def median(values):
sortedlist =  numpy.sort(values)
length = len(sortedlist)
half = length // 2

if length % 2 == 0:
return (sortedlist[half] + sortedlist[half - 1]) // 2
else:
return sortedlist[half]

def main():

m, n = 1000, 100000000
# Random Number Generator
start_time = time.time()
data = numpy.random.randint(1, m, n)
print("--- %s seconds to numpy random---" % (time.time() - start_time))
# Median
start_time = time.time()
result = median(data)
print("Result: ", result)
print("--- %s seconds to find the Median---" % (time.time() - start_time))

if __name__ == "__main__":

main()
print("--- %s seconds to finish the program---" % (time.time() - start_time0))