Advertisement
homer512

tail py

Jun 17th, 2014
252
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.97 KB | None | 0 0
  1. #!/usr/bin/python2
  2.  
  3.  
  4. """Tests different versions to implement tail (except seek or mmap)
  5.  
  6. Results for python-2.7, linux x86_64:
  7.  
  8. 20940 lines, average line length 163:
  9. dequetail       3.69968
  10. listtail        5.02768
  11.  
  12. Performance seems largely independent of requested number of lines
  13. """
  14.  
  15. import collections
  16. import sys
  17. import timeit
  18.  
  19.  
  20. def tail(filename, count, method):
  21.     with open(filename, 'r') as filein:
  22.         return method(filein, count)
  23.  
  24.  
  25. def dequetail(filein, count):
  26.     return collections.deque(filein, count)
  27.  
  28.  
  29. def listtail(filein, count):
  30.     lines = list()
  31.     readlines = filein.readlines
  32.     while True:
  33.         block = readlines(8196)
  34.         if block:
  35.             replaced = max(0, len(block) + len(lines) - count)
  36.             del lines[:replaced]
  37.             lines += block
  38.         else:
  39.             break
  40.     del lines[:-count]
  41.     return lines
  42.  
  43.  
  44. def test(methods, filename, count):
  45.     results = ((method, list(tail(filename, count, method))) for method
  46.                in methods)
  47.     _, trusted = next(results)
  48.     wrongs = (method.__name__ for method, result in results
  49.               if result != trusted)
  50.     messages = ("%s failed\n" % method for method in wrongs)
  51.     sys.stderr.writelines(messages)
  52.  
  53.  
  54. filename = None
  55.  
  56. def main():
  57.     global filename
  58.     filename = sys.argv[1]
  59.     count = 100
  60.     methods = (dequetail, listtail)
  61.     test(methods, filename, count)
  62.     methodnames = [method.__name__ for method in methods]
  63.     setups = ('from __main__ import %s, tail, filename' % method for method
  64.               in methodnames)
  65.     stmts = ("tail(filename, %d, %s)" % (count, method) for method
  66.              in methodnames)
  67.     times = (timeit.timeit(setup=setup, stmt=stmt, number=1000)
  68.              for setup, stmt in zip(setups, stmts))
  69.     output = ("%s\t%g\n" % (method, time) for method, time
  70.               in zip(methodnames, times))
  71.     sys.stderr.writelines(output)
  72.  
  73.  
  74. if __name__ == '__main__':
  75.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement