From 15a16320c91ea7be43a7b0adebd83f39e20b8392 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 2 Feb 2017 11:12:47 +0200 Subject: Issue #29368: The extend() method is now called instead of the append() method when unpickle collections.deque and other list-like objects. This can speed up unpickling to 2 times. --- Lib/pickle.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'Lib/pickle.py') diff --git a/Lib/pickle.py b/Lib/pickle.py index c8370c9f7e..702b0b35ce 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -1464,12 +1464,19 @@ class _Unpickler: def load_appends(self): items = self.pop_mark() list_obj = self.stack[-1] - if isinstance(list_obj, list): - list_obj.extend(items) + try: + extend = list_obj.extend + except AttributeError: + pass else: - append = list_obj.append - for item in items: - append(item) + extend(items) + return + # Even if the PEP 307 requires extend() and append() methods, + # fall back on append() if the object has no extend() method + # for backward compatibility. + append = list_obj.append + for item in items: + append(item) dispatch[APPENDS[0]] = load_appends def load_setitem(self): -- cgit v1.2.1