Complexity of list.index(x) in Python

PythonAlgorithmListBig OPerformance

Python Problem Overview


I'm referring to this: http://docs.python.org/tutorial/datastructures.html

What would be the running time of list.index(x) function in terms of Big O notation?

Python Solutions


Solution 1 - Python

It's O(n), also check out: http://wiki.python.org/moin/TimeComplexity > This page documents the time-complexity (aka "Big O" or "Big Oh") of various operations in current CPython. Other Python implementations (or older or still-under development versions of CPython) may have slightly different performance characteristics. However, it is generally safe to assume that they are not slower by more than a factor of O(log n)...

Solution 2 - Python

According to said documentation:

> list.index(x) > > Return the index in the list of the first item whose value is x. > It is an error if there is no such item.

Which implies searching. You're effectively doing x in s but rather than returning True or False you're returning the index of x. As such, I'd go with the listed time complexity of O(n).

Solution 3 - Python

Any list implementation is going to have an O(n) complexity for a linear search (e.g., list.index). Although maybe there are some wacky implementations out there that do worse...

You can improve lookup complexity by using different data structures, such as ordered lists or sets. These are usually implemented with binary trees. However, these data structures put constraints on the elements they contain. In the case of a binary tree, the elements need to be orderable, but the lookup cost goes down to O(log n).

As mentioned previously, look here for run time costs of standard Python data structures: http://wiki.python.org/moin/TimeComplexity

Solution 4 - Python

Use the following code to check the timing. Its complexity is O(n).

import time


class TimeChecker:

    def __init__(self, name):
        self.name = name

    def __enter__(self):
        self.start = self.get_time_in_sec()
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        now = self.get_time_in_sec()
        time_taken = now - self.start  # in seconds
        print("Time Taken by " + self.name + ": " + str(time_taken))

    def get_time_in_sec(self):
        return int(round(time.time() * 1000))


def test_list_index_func(range_num):
    lis = [1,2,3,4,5]
    with TimeChecker('Process 1') as tim:
        for i in range(range_num):
            lis.index(4)

test_list_index_func(1000)
test_list_index_func(10000)
test_list_index_func(100000)
test_list_index_func(1000000)

print("Time: O(n)")

Solution 5 - Python

The documentation provided above did not cover list.index()

from my understanding, list.index is O(1) operation. Here is a link if you want to know more. https://www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt

Solution 6 - Python

Try this code, it will help you to get your execution time taken by lis.index operator.

import timeit
lis=[11,22,33,44,55,66,77] 
for i in lis: 
    t = timeit.Timer("lis.index(11)", "from main import lis") 
    TimeTaken= t.timeit(number=100000) 
    print (TimeTaken)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser734027View Question on Stackoverflow
Solution 1 - PythonzeekayView Answer on Stackoverflow
Solution 2 - Pythonuser257111View Answer on Stackoverflow
Solution 3 - PythonAlex SmithView Answer on Stackoverflow
Solution 4 - PythonGeetesh GuptaView Answer on Stackoverflow
Solution 5 - PythonA story-tellerView Answer on Stackoverflow
Solution 6 - PythonChin DanzalView Answer on Stackoverflow