Guest User

Untitled

a guest
Jul 29th, 2014
412
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.48 KB | None | 0 0
  1. #!/usr/bin/env python3
  2.  
  3. import io
  4.  
  5. def reverse_lines(*args, **kwargs):
  6.     with open(*args, **kwargs) as f:
  7.         buf = ''
  8.         f.seek(0, io.SEEK_END)
  9.         while f.tell():
  10.             try:
  11.                 f.seek(-1024, io.SEEK_CUR)
  12.             except OSError:
  13.                 bufsize = f.tell()
  14.                 f.seek(0, io.SEEK_SET)
  15.                 newbuf = f.read(bufsize)
  16.                 f.seek(0, io.SEEK_SET)
  17.             else:
  18.                 newbuf = f.read(1024)
  19.                 f.seek(-1024, io.SEEK_CUR)
  20.             buf = newbuf + buf
  21.             lines = buf.split('\n')
  22.             buf = lines.pop(0)
  23.             yield from reversed(lines)
  24.         yield buf
  25.  
  26. def test_reversed():
  27.     with open('bigfile.txt') as f:
  28.         for _ in reversed(list(f)):
  29.             pass
  30.  
  31. def test_revlines():
  32.     list(reverse_lines('bigfile.txt'))
  33.  
  34. def makefile(count):
  35.     import random
  36.     import string
  37.     with open('bigfile.txt', 'w') as f:
  38.         for _ in range(count):
  39.             f.write(''.join(random.choice(string.ascii_letters)
  40.                             for _ in range(72)) + '\n')
  41.  
  42. if __name__ == '__main__':
  43.     import timeit
  44.     for count in 100, 1000, 10000, 100000, 1000000:
  45.         makefile(count)
  46.         treversed = timeit.timeit(test_reversed, number=1000000//count)
  47.         trevlines = timeit.timeit(test_revlines, number=1000000//count)
  48.         print('{:8} lines: {} reversed, {} revlines'.format(
  49.             count, treversed, trevlines))
Advertisement
Add Comment
Please, Sign In to add comment