Drowning in a teacup?

Vito De Tullio vito.detullio at gmail.com
Sat Apr 2 02:26:35 EDT 2016


Michael Selik wrote:

>> > I need to scan a list of strings. If one of the elements matches the
>> > beginning of a search keyword, that element needs to snap to the front
>> > of the list.
>>
>> I know this post regards the function passing, but, on you specific
>> problem,
>> can't you just ... sort the list with a custom key?
>
> If the number of matches is small relative to the size of the list, I'd
> expect the sort would be slower than most of the other suggestions.

umm... I take the liberty to set up a little test

    $ cat test_sort_prefix.py
    #!/usr/bin/env python3

    from sys import argv
    from timeit import timeit


    def sort_in_place(l):
        def key(e):
            return not e.startswith('yes')
        l.sort(key=key)


    def original_solution(mylist):
        for i in range(len(mylist)):
            if(mylist[i].startswith('yes')):
                mylist[:] = [mylist[i]] + mylist[:i] + mylist[i+1:]


    def main():
        if argv[1] == 'sort_in_place':
            f = sort_in_place
        elif argv[1] == 'original_solution':
            f = original_solution
        else:
            raise Exception()

        nomatches = int(argv[2])
        matches = int(argv[3])

        l = ["no_" for _ in range(nomatches)] + ["yes_" for _ in 
range(matches)]

        print(timeit("f(l)", number=100, globals={"f": f, "l": l}))

    if __name__ == '__main__':
        main()
    $ ./test_sort_prefix.py sort_in_place 1000000 3
    33.260575089996564
    $ ./test_sort_prefix.py original_solution 1000000 3
    35.93009542999789
    $


in my tests there is no sensible difference between the two solutions... and 
the number of matches is risible :)

-- 
By ZeD




More information about the Python-list mailing list