Commit 375972f1 authored by Vladislav Yarmak's avatar Vladislav Yarmak

1337-diff: 3x speed improvement

parent 0fa7df74
...@@ -64,24 +64,29 @@ def feed_chunks(f, chunk_size=4096): ...@@ -64,24 +64,29 @@ def feed_chunks(f, chunk_size=4096):
yield buf yield buf
def zip_files_bytes(*files): def zip_files_bytes(left, right):
""" Iterate over two files, returning pair of bytes. """ Iterate over two files, returning pair of bytes.
Throw LengthMismatch if file sizes is uneven. """ Throw LengthMismatch if file sizes is uneven. """
class EndMarker(object): class EndMarker(object):
pass pass
end_marker = EndMarker() end_marker = EndMarker()
iterators = (itertools.chain.from_iterable(feed_chunks(f)) for f in files) left_iter = itertools.chain.from_iterable(feed_chunks(left))
for tup in itertools.zip_longest(*iterators, fillvalue=end_marker): right_iter = itertools.chain.from_iterable(feed_chunks(right))
if any(v is end_marker for v in tup): for a, b in itertools.zip_longest(left_iter,
right_iter,
fillvalue=end_marker):
if a is end_marker or b is end_marker:
raise LengthMismatchException("Length of input files inequal.") raise LengthMismatchException("Length of input files inequal.")
yield tup yield a, b
def diff(left, right): def diff(left, right):
for offset, (a, b) in enumerate(zip_files_bytes(left, right)): offset = 0
for a, b in zip_files_bytes(left, right):
if a != b: if a != b:
yield offset, a, b yield offset, a, b
offset += 1
def compose_diff_file(orig, patched, output, header, offset_adjustment=True): def compose_diff_file(orig, patched, output, header, offset_adjustment=True):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment