Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python3
- import io
- def reverse_lines(*args, **kwargs):
- with open(*args, **kwargs) as f:
- buf = ''
- f.seek(0, io.SEEK_END)
- while f.tell():
- try:
- f.seek(-1024, io.SEEK_CUR)
- except OSError:
- bufsize = f.tell()
- f.seek(0, io.SEEK_SET)
- newbuf = f.read(bufsize)
- f.seek(0, io.SEEK_SET)
- else:
- newbuf = f.read(1024)
- f.seek(-1024, io.SEEK_CUR)
- buf = newbuf + buf
- lines = buf.split('\n')
- buf = lines.pop(0)
- yield from reversed(lines)
- yield buf
- def test_reversed():
- with open('bigfile.txt') as f:
- for _ in reversed(list(f)):
- pass
- def test_revlines():
- list(reverse_lines('bigfile.txt'))
- def makefile(count):
- import random
- import string
- with open('bigfile.txt', 'w') as f:
- for _ in range(count):
- f.write(''.join(random.choice(string.ascii_letters)
- for _ in range(72)) + '\n')
- if __name__ == '__main__':
- import timeit
- for count in 100, 1000, 10000, 100000, 1000000:
- makefile(count)
- treversed = timeit.timeit(test_reversed, number=1000000//count)
- trevlines = timeit.timeit(test_revlines, number=1000000//count)
- print('{:8} lines: {} reversed, {} revlines'.format(
- count, treversed, trevlines))
Advertisement
Add Comment
Please, Sign In to add comment