Skip to content

Commit

Permalink
Use bisect to speed up finding the best fit
Browse files Browse the repository at this point in the history
  • Loading branch information
SmileyChris committed Dec 4, 2013
1 parent b2553a3 commit c391e75
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 10 deletions.
14 changes: 4 additions & 10 deletions qrcode/main.py
Expand Up @@ -112,16 +112,10 @@ def best_fit(self, start=None):
"""
Find the minimum size required to fit in the data.
"""
size = start or 1
while True:
try:
self.data_cache = util.create_data(
size, self.error_correction, self.data_list)
except exceptions.DataOverflowError:
size += 1
else:
self.version = size
return size
self.data_cache, self.version = (
util.BestFit(self.error_correction, self.data_list)
.data_and_version(start))
return self.version

def best_mask_pattern(self):
"""
Expand Down
29 changes: 29 additions & 0 deletions qrcode/util.py
@@ -1,3 +1,4 @@
from bisect import bisect
import re
import math

Expand Down Expand Up @@ -533,3 +534,31 @@ def create_data(version, error_correction, data_list):
buffer.put(PAD1, 8)

return create_bytes(buffer, rs_blocks)


class BestFit(object):

def __init__(self, error_correction, data_list):
self.error_correction = error_correction
self.data_list = data_list
self.iterations = 0

def data_and_version(self, start=None):
if not start:
start = 1
version = bisect(self, 0, start, 41)
if version == 41:
raise exceptions.DataOverflowError()
return self.data_cache, version

def __getitem__(self, size):
"""
Returns 0 if it overflowed, 1 if it fit.
"""
self.iterations += 1
try:
self.data_cache = create_data(
size, self.error_correction, self.data_list)
except exceptions.DataOverflowError:
return 0
return 1

0 comments on commit c391e75

Please sign in to comment.