Skip to content

Instantly share code, notes, and snippets.

@davidak
Last active July 31, 2018 15:23

Revisions

  1. davidak revised this gist Jul 31, 2018. 1 changed file with 27 additions and 25 deletions.
    52 changes: 27 additions & 25 deletions results.md
    Original file line number Diff line number Diff line change
    @@ -1,34 +1,36 @@
    # original list with 11 items
    # Execution time in seconds

    jpp: 0.038900841027498245
    Laurent H.: 0.09572448302060366
    Kevin: 0.007683080970309675
    davidak: 0.027118309983052313
    ## original list with 11 items

    # list with 100 items
    jpp: 0.038900841027498245
    Laurent H.: 0.09572448302060366
    Kevin: 0.007683080970309675
    davidak: 0.027118309983052313

    jpp: 0.085919318953529
    Laurent H.: 0.8218901020009071
    Kevin: 0.007853235001675785
    davidak: 0.046300466055981815
    ## list with 100 items

    # list with 1000 items
    jpp: 0.085919318953529
    Laurent H.: 0.8218901020009071
    Kevin: 0.007853235001675785
    davidak: 0.046300466055981815

    jpp: 0.2682207649340853
    Laurent H.: 5.869488948956132
    Kevin: 0.008967073052190244
    davidak: 0.26018757303245366
    ## list with 1000 items

    # list with 10000 items
    jpp: 0.2682207649340853
    Laurent H.: 5.869488948956132
    Kevin: 0.008967073052190244
    davidak: 0.26018757303245366

    jpp: 2.4661101199453697
    Laurent H.: 62.00245025800541
    Kevin: 0.009241680963896215
    davidak: 2.5198689920362085
    ## list with 10000 items

    # list with 100000 items
    jpp: 2.4661101199453697
    Laurent H.: 62.00245025800541
    Kevin: 0.009241680963896215
    davidak: 2.5198689920362085

    jpp: 24.208682479104027
    Laurent H.: 680.6267002499662
    Kevin: 0.009258356061764061
    davidak: 26.868416464072652
    ## list with 100000 items

    jpp: 24.208682479104027
    Laurent H.: 680.6267002499662
    Kevin: 0.009258356061764061
    davidak: 26.868416464072652
  2. davidak revised this gist Jul 31, 2018. 3 changed files with 82 additions and 18 deletions.
    4 changes: 0 additions & 4 deletions output
    Original file line number Diff line number Diff line change
    @@ -1,4 +0,0 @@
    jpp: 3.6361226870212704
    Laurent H.: 10.126299427938648
    Kevin: 0.786450024927035
    davidak: 2.6573368250392377
    34 changes: 34 additions & 0 deletions results.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,34 @@
    # original list with 11 items

    jpp: 0.038900841027498245
    Laurent H.: 0.09572448302060366
    Kevin: 0.007683080970309675
    davidak: 0.027118309983052313

    # list with 100 items

    jpp: 0.085919318953529
    Laurent H.: 0.8218901020009071
    Kevin: 0.007853235001675785
    davidak: 0.046300466055981815

    # list with 1000 items

    jpp: 0.2682207649340853
    Laurent H.: 5.869488948956132
    Kevin: 0.008967073052190244
    davidak: 0.26018757303245366

    # list with 10000 items

    jpp: 2.4661101199453697
    Laurent H.: 62.00245025800541
    Kevin: 0.009241680963896215
    davidak: 2.5198689920362085

    # list with 100000 items

    jpp: 24.208682479104027
    Laurent H.: 680.6267002499662
    Kevin: 0.009258356061764061
    davidak: 26.868416464072652
    62 changes: 48 additions & 14 deletions test.py
    Original file line number Diff line number Diff line change
    @@ -1,12 +1,14 @@
    #!/usr/bin/env python3

    import numpy as np
    import matplotlib
    matplotlib.use('AGG')
    import matplotlib.pyplot as plt
    import copy
    import timeit

    l = [False, False, False, True, True, True, False, False, True, False, False]
    k = [True, True, True, True, True, True, False, False, True, True, True]
    number = 1000000

    iterations = 10000


    def invert_edge_values_jpp(l):
    @@ -63,14 +65,46 @@ def invert_edge_values_davidak(l):


    if __name__ == '__main__':
    # test functions
    np.testing.assert_array_equal(invert_edge_values_jpp(l), np.array(k))
    np.testing.assert_array_equal(np.array(invert_edge_values_laurent_h(l)), np.array(k))
    np.testing.assert_array_equal(np.array(invert_edge_values_kevin(l)), np.array(k))
    np.testing.assert_array_equal(invert_edge_values_davidak(l), np.array(k))

    # measure execution
    print("jpp:", timeit.timeit("invert_edge_values_jpp(l)", number=number, globals=globals()))
    print("Laurent H.:", timeit.timeit("invert_edge_values_laurent_h(l)", number=number, globals=globals()))
    print("Kevin:", timeit.timeit("invert_edge_values_kevin(l)", number=number, globals=globals()))
    print("davidak:", timeit.timeit("invert_edge_values_davidak(l)", number=number, globals=globals()))
    # create long random list of booleans
    # with some False on the edges
    l = []
    list_items = 100000

    number_pre_false = np.random.randint(5)
    number_past_false = np.random.randint(5)
    number_random_bool = list_items - (number_pre_false + number_past_false)

    for i in range(number_pre_false):
    l.append(False)

    for i in range(number_random_bool):
    l.append(np.random.rand() > 0.5)

    for i in range(number_past_false):
    l.append(False)

    # l = [False, False, False, True, True, True, False, False, True, False, False]
    # list_items = len(l)

    jpp = timeit.timeit("invert_edge_values_jpp(l)", number=iterations, globals=globals())
    laurent_h = timeit.timeit("invert_edge_values_laurent_h(l)", number=iterations, globals=globals())
    kevin = timeit.timeit("invert_edge_values_kevin(l)", number=iterations, globals=globals())
    davidak = timeit.timeit("invert_edge_values_davidak(l)", number=iterations, globals=globals())

    print("jpp:", jpp)
    print("Laurent H.:", laurent_h)
    print("Kevin:", kevin)
    print("davidak:", davidak)

    dpi = 96
    fig = plt.figure(num=None, figsize=(1024/dpi, 768/dpi), dpi=dpi)
    ax = fig.add_subplot(111)

    plt.title("Comparison of functions to invert edge values in python boolean list (with {} items)".format(list_items))
    ax.set_ylabel('execution time of {} iterations in seconds'.format(iterations))

    x = ['jpp', 'Laurent H.', 'Kevin', 'davidak']
    y = [jpp, laurent_h, kevin, davidak]
    ax.bar(x, y)

    plt.savefig("test.svg")
  3. davidak revised this gist Jul 31, 2018. 2 changed files with 15 additions and 9 deletions.
    8 changes: 4 additions & 4 deletions output
    Original file line number Diff line number Diff line change
    @@ -1,4 +1,4 @@
    jpp: 46.10399893007707
    Laurent H.: 52.31541666598059
    Kevin: 41.856350317946635
    davidak: 43.6837813219754
    jpp: 3.6361226870212704
    Laurent H.: 10.126299427938648
    Kevin: 0.786450024927035
    davidak: 2.6573368250392377
    16 changes: 11 additions & 5 deletions test.py
    Original file line number Diff line number Diff line change
    @@ -4,7 +4,6 @@
    import copy
    import timeit


    l = [False, False, False, True, True, True, False, False, True, False, False]
    k = [True, True, True, True, True, True, False, False, True, True, True]
    number = 1000000
    @@ -18,7 +17,7 @@ def invert_edge_values_jpp(l):
    l[:idx1] = True
    l[len(l)-idx2:] = True

    np.testing.assert_array_equal(l, np.array(k))
    return l


    def invert_edge_values_laurent_h(l):
    @@ -35,7 +34,7 @@ def invert_edge_values_laurent_h(l):
    if v == tempList[-1]: l[i] = not v
    else: break

    np.testing.assert_array_equal(np.array(l), np.array(k))
    return l


    def invert_edge_values_kevin(l):
    @@ -49,7 +48,7 @@ def invert_edge_values_kevin(l):
    break
    l[i] = True

    np.testing.assert_array_equal(np.array(l), np.array(k))
    return l


    def invert_edge_values_davidak(l):
    @@ -60,10 +59,17 @@ def invert_edge_values_davidak(l):
    l[:first] = True
    l[last + 1:] = True

    np.testing.assert_array_equal(l, np.array(k))
    return l


    if __name__ == '__main__':
    # test functions
    np.testing.assert_array_equal(invert_edge_values_jpp(l), np.array(k))
    np.testing.assert_array_equal(np.array(invert_edge_values_laurent_h(l)), np.array(k))
    np.testing.assert_array_equal(np.array(invert_edge_values_kevin(l)), np.array(k))
    np.testing.assert_array_equal(invert_edge_values_davidak(l), np.array(k))

    # measure execution
    print("jpp:", timeit.timeit("invert_edge_values_jpp(l)", number=number, globals=globals()))
    print("Laurent H.:", timeit.timeit("invert_edge_values_laurent_h(l)", number=number, globals=globals()))
    print("Kevin:", timeit.timeit("invert_edge_values_kevin(l)", number=number, globals=globals()))
  4. davidak created this gist Jul 31, 2018.
    4 changes: 4 additions & 0 deletions output
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,4 @@
    jpp: 46.10399893007707
    Laurent H.: 52.31541666598059
    Kevin: 41.856350317946635
    davidak: 43.6837813219754
    70 changes: 70 additions & 0 deletions test.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,70 @@
    #!/usr/bin/env python3

    import numpy as np
    import copy
    import timeit


    l = [False, False, False, True, True, True, False, False, True, False, False]
    k = [True, True, True, True, True, True, False, False, True, True, True]
    number = 1000000


    def invert_edge_values_jpp(l):
    idx1 = next(i for i, j in enumerate(l) if j)
    idx2 = next(i for i, j in enumerate(l[::-1]) if j)

    l = np.array(l)
    l[:idx1] = True
    l[len(l)-idx2:] = True

    np.testing.assert_array_equal(l, np.array(k))


    def invert_edge_values_laurent_h(l):
    l = copy.deepcopy(l)
    tempList = l[:]

    # Iterate from the beginning (and invert) until the element differs from the first one
    for i,v in enumerate(tempList):
    if v == tempList[0]: l[i] = not v
    else: break

    # Iterate from the end (and invert) until the element differs from the last one
    for i,v in reversed(list(enumerate(tempList))):
    if v == tempList[-1]: l[i] = not v
    else: break

    np.testing.assert_array_equal(np.array(l), np.array(k))


    def invert_edge_values_kevin(l):
    for i in range(len(l)):
    if l[i]:
    break
    l[i] = True

    for i in range(len(l)-1, -1, -1):
    if l[i]:
    break
    l[i] = True

    np.testing.assert_array_equal(np.array(l), np.array(k))


    def invert_edge_values_davidak(l):
    l = np.array(l)
    ind = np.where(l)[0]
    first, last = ind[0], ind[-1]

    l[:first] = True
    l[last + 1:] = True

    np.testing.assert_array_equal(l, np.array(k))


    if __name__ == '__main__':
    print("jpp:", timeit.timeit("invert_edge_values_jpp(l)", number=number, globals=globals()))
    print("Laurent H.:", timeit.timeit("invert_edge_values_laurent_h(l)", number=number, globals=globals()))
    print("Kevin:", timeit.timeit("invert_edge_values_kevin(l)", number=number, globals=globals()))
    print("davidak:", timeit.timeit("invert_edge_values_davidak(l)", number=number, globals=globals()))