Lastor already said what I was going to point out so I am not going to repeat that. I'll just add some other things. I tried timing your solution with a bunch of other solutions I came up with. Among these the one with best time-memory combination should be the function `mysort3` as it gave me best timing in nearly all cases. I am still looking about [proper timing][1] in Python. You can try putting in different test cases in the function `tests` to test the timing for yourself. def mysort(words): mylist1 = sorted([i for i in words if i[:1] == "s"]) mylist2 = sorted([i for i in words if i[:1] != "s"]) list = mylist1 + mylist2 return list def mysort3(words): ans = [] p = ans.append q = words.remove words.sort() for i in words[:]: if i[0] == 's': p(i) q(i) return ans + words def mysort4(words): ans1 = [] ans2 = [] p = ans1.append q = ans2.append for i in words: if i[0] == 's': p(i) else: q(i) ans1.sort() ans2.sort() return ans1 + ans2 def mysort6(words): return ( sorted([i for i in words if i[:1] == "s"]) + sorted([i for i in words if i[:1] != "s"]) ) if __name__ == "__main__": from timeit import Timer def test(f): f(['a','b','c','abcd','s','se', 'ee', 'as']) print Timer(lambda: test(mysort)).timeit(number = 10000) print Timer(lambda: test(mysort3)).timeit(number = 10000) print Timer(lambda: test(mysort4)).timeit(number = 10000) print Timer(lambda: test(mysort6)).timeit(number = 10000) [1]: https://codereview.stackexchange.com/questions/28373/is-this-the-proper-way-of-doing-timing-analysis-of-many-test-cases-in-python-or