Skip to content

Commit 423217b

Browse files
authored
Merge pull request #54 from maxmind/greg/faster-pp
Improve performance when reading 28 bit nodes
2 parents 728d06c + 7e5bdb0 commit 423217b

File tree

3 files changed

+9
-8
lines changed

3 files changed

+9
-8
lines changed

.travis.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ matrix:
1010
dist: trusty
1111
- python: 3.7
1212
dist: xenial
13+
- python: 3.8
14+
dist: xenial
1315
env: RUN_LINTER=1
1416
- python: nightly
1517
dist: xenial

examples/benchmark.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
args = parser.parse_args()
2424

25+
random.seed(0)
2526
reader = maxminddb.open_database(args.file, args.mode)
2627

2728

maxminddb/reader.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
import struct
1717

18-
from maxminddb.compat import byte_from_int, compat_ip_address, string_type
18+
from maxminddb.compat import compat_ip_address, string_type
1919
from maxminddb.const import MODE_AUTO, MODE_MMAP, MODE_FILE, MODE_MEMORY, MODE_FD
2020
from maxminddb.decoder import Decoder
2121
from maxminddb.errors import InvalidDatabaseError
@@ -179,15 +179,13 @@ def _read_node(self, node_number, index):
179179
offset = base_offset + index * 3
180180
node_bytes = b'\x00' + self._buffer[offset:offset + 3]
181181
elif record_size == 28:
182-
(middle, ) = struct.unpack(
183-
b'!B', self._buffer[base_offset + 3:base_offset + 4])
182+
offset = base_offset + 3 * index
183+
node_bytes = bytearray(self._buffer[offset:offset + 4])
184184
if index:
185-
middle &= 0x0F
185+
node_bytes[0] = 0x0F & node_bytes[0]
186186
else:
187-
middle = (0xF0 & middle) >> 4
188-
offset = base_offset + index * 4
189-
node_bytes = byte_from_int(middle) + self._buffer[offset:offset +
190-
3]
187+
middle = (0xF0 & node_bytes.pop()) >> 4
188+
node_bytes.insert(0, middle)
191189
elif record_size == 32:
192190
offset = base_offset + index * 4
193191
node_bytes = self._buffer[offset:offset + 4]

0 commit comments

Comments
 (0)