[Solved] Is there a more efficient way to find index of an element without using list built-in functions?


use list comprehension in python

l = [3, 11, 4, 9, 1, 23, 5, 11]
indexes = [index for index in range(len(l)) if l[index] == 11]

output:

[1, 7]

use numpy for finding the matching indices.

import numpy as np

l = [3, 11, 4, 9, 1, 23, 5, 11]
np_array = np.array(l)
item_index = np.where(np_array == 11)
print (item_index)

Numpy is efficient:

import random
import time

import numpy as np

limit = 10 ** 7
l = [None] * limit
for i in range(limit):
    l[i] = random.randint(0, 1000000)

start = time.time()
np_array = np.array(l)
item_index = np.where(np_array == 11)
print('time taken by numpy', time.time() - start)

start = time.time()
for index, value in enumerate(l):
    if (value == 11):
        pass
print('time taken by enumerate',time.time() - start)

Output:

time taken by numpy 0.9375550746917725
time taken by enumerate 1.4508612155914307

timeit

import random
import sys
import time
from multiprocessing import Process
from threading import Thread

import numpy as np

start = time.time()
limit = (10 ** 4)
l = [None] * limit
for i in range(limit):
    l[i] = random.randint(0, 1000000)


def testNumpy():
    np_array = np.array(l)
    for i in range(1000):
        value = random.randint(0, 1000000)
        item_index = np.where(np_array == value)


def testEnumerate():
    for i in range(1000):
        randValue = random.randint(0, 1000000)
        for index, value in enumerate(l):
            if (value == randValue):
                pass


def _testNumpy(repeat):
    import timeit
    s = """\
testNumpy()
    """
    print(timeit.timeit(stmt=s, setup="from __main__ import testNumpy", number=repeat, globals=globals()),
          end=":numpy\n")


def _testEnumerate(repeat):
    import timeit
    s = """\
testEnumerate()
        """
    print(timeit.timeit(stmt=s, setup="from __main__ import testEnumerate", number=repeat, globals=globals()),
          end=':enumerate\n')


if __name__ == "__main__":
    repeat = 10
    processes = [Process(target=_testNumpy, args=(repeat,)), Process(target=_testEnumerate, args=(repeat,))]
    for process in processes:
        process.start()

    for process in processes:
        process.join()

Output:

0.2232685430001311:numpy
8.573617108999997:enumerate

7

solved Is there a more efficient way to find index of an element without using list built-in functions?