def google_merge(list1, list2):
result = []
while len(list1) and len(list2):
if list1[0] < list2[0]:
result.append(list1.pop(0))
else:
result.append(list2.pop(0))
result.extend(list1)
result.extend(list2)
return result
def ewiethoff_merge(list1, list2):
result = []
while len(list1) and len(list2):
if list1[-1] < list2[-1]:
result.append(list2.pop())
else:
result.append(list1.pop())
result.extend(reversed(list2))
result.extend(reversed(list1))
return list(reversed(result))
def list1(): return range(LO1, HI1)
def list2(): return range(LO2, HI2)
LO1, LO2, HI1, HI2 = 2, 0, 9, 5
print list1(), list2()
print google_merge(list1(), list2())
print ewiethoff_merge(list1(), list2())
print; print
import cProfile
LO1, LO2, HI1, HI2 = 202, 0, 90009, 50005
cProfile.run('google_merge(list1(), list2())')
cProfile.run('ewiethoff_merge(list1(), list2())')
ZGVmIGdvb2dsZV9tZXJnZShsaXN0MSwgbGlzdDIpOgogICAgcmVzdWx0ID0gW10KICAgIHdoaWxlIGxlbihsaXN0MSkgYW5kIGxlbihsaXN0Mik6CiAgICAgICAgaWYgbGlzdDFbMF0gPCBsaXN0MlswXToKICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChsaXN0MS5wb3AoMCkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChsaXN0Mi5wb3AoMCkpCiAgICByZXN1bHQuZXh0ZW5kKGxpc3QxKQogICAgcmVzdWx0LmV4dGVuZChsaXN0MikKICAgIHJldHVybiByZXN1bHQKCmRlZiBld2lldGhvZmZfbWVyZ2UobGlzdDEsIGxpc3QyKToKICAgIHJlc3VsdCA9IFtdCiAgICB3aGlsZSBsZW4obGlzdDEpIGFuZCBsZW4obGlzdDIpOgogICAgICAgIGlmIGxpc3QxWy0xXSA8IGxpc3QyWy0xXToKICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChsaXN0Mi5wb3AoKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHQuYXBwZW5kKGxpc3QxLnBvcCgpKQogICAgcmVzdWx0LmV4dGVuZChyZXZlcnNlZChsaXN0MikpCiAgICByZXN1bHQuZXh0ZW5kKHJldmVyc2VkKGxpc3QxKSkKICAgIHJldHVybiBsaXN0KHJldmVyc2VkKHJlc3VsdCkpCgpkZWYgbGlzdDEoKTogcmV0dXJuIHJhbmdlKExPMSwgSEkxKQpkZWYgbGlzdDIoKTogcmV0dXJuIHJhbmdlKExPMiwgSEkyKQoKTE8xLCBMTzIsIEhJMSwgSEkyID0gMiwgMCwgOSwgNQpwcmludCBsaXN0MSgpLCBsaXN0MigpCnByaW50IGdvb2dsZV9tZXJnZShsaXN0MSgpLCBsaXN0MigpKQpwcmludCBld2lldGhvZmZfbWVyZ2UobGlzdDEoKSwgbGlzdDIoKSkKcHJpbnQ7IHByaW50CgppbXBvcnQgY1Byb2ZpbGUKTE8xLCBMTzIsIEhJMSwgSEkyID0gMjAyLCAwLCA5MDAwOSwgNTAwMDUKY1Byb2ZpbGUucnVuKCdnb29nbGVfbWVyZ2UobGlzdDEoKSwgbGlzdDIoKSknKQpjUHJvZmlsZS5ydW4oJ2V3aWV0aG9mZl9tZXJnZShsaXN0MSgpLCBsaXN0MigpKScpCg==
[2, 3, 4, 5, 6, 7, 8] [0, 1, 2, 3, 4]
[0, 1, 2, 2, 3, 3, 4, 4, 5, 6, 7, 8]
[0, 1, 2, 2, 3, 3, 4, 4, 5, 6, 7, 8]
399239 function calls in 4.306 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.003 0.003 4.306 4.306 <string>:1(<module>)
1 0.328 0.328 4.298 4.298 prog.py:1(google_merge)
1 0.000 0.000 0.003 0.003 prog.py:23(list1)
1 0.000 0.000 0.002 0.002 prog.py:24(list2)
199616 0.061 0.000 0.061 0.000 {len}
99807 0.031 0.000 0.031 0.000 {method 'append' of 'list' objects}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
2 0.000 0.000 0.000 0.000 {method 'extend' of 'list' objects}
99807 3.878 0.000 3.878 0.000 {method 'pop' of 'list' objects}
2 0.005 0.003 0.005 0.003 {range}
558446 function calls in 0.542 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.004 0.004 0.542 0.542 <string>:1(<module>)
1 0.358 0.358 0.536 0.536 prog.py:12(ewiethoff_merge)
1 0.000 0.000 0.002 0.002 prog.py:23(list1)
1 0.000 0.000 0.001 0.001 prog.py:24(list2)
279219 0.080 0.000 0.080 0.000 {len}
139609 0.047 0.000 0.047 0.000 {method 'append' of 'list' objects}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
2 0.000 0.000 0.000 0.000 {method 'extend' of 'list' objects}
139609 0.051 0.000 0.051 0.000 {method 'pop' of 'list' objects}
2 0.003 0.001 0.003 0.001 {range}