[pypy-commit] pypy set-strategies: better approach for merging sets with lists
l.diekmann
noreply at buildbot.pypy.org
Tue Dec 20 16:19:58 CET 2011
Author: Lukas Diekmann <lukas.diekmann at uni-duesseldorf.de>
Branch: set-strategies
Changeset: r50760:01dbcc06249a
Date: 2011-12-20 16:19 +0100
http://bitbucket.org/pypy/pypy/changeset/01dbcc06249a/
Log: better approach for merging sets with lists
diff --git a/pypy/objspace/std/listobject.py b/pypy/objspace/std/listobject.py
--- a/pypy/objspace/std/listobject.py
+++ b/pypy/objspace/std/listobject.py
@@ -193,6 +193,11 @@
""" Return the items in the list as unwrapped strings. If the list does
not use the list strategy, return None. """
return self.strategy.getitems_str(self)
+
+ def getitems_int(self):
+ """ Return the items in the list as unwrapped strings. If the list does
+ not use the list strategy, return None. """
+ return self.strategy.getitems_int(self)
# ___________________________________________________
@@ -292,6 +297,9 @@
def getitems_str(self, w_list):
return None
+ def getitems_int(self, w_list):
+ return None
+
def getstorage_copy(self, w_list):
raise NotImplementedError
@@ -502,17 +510,15 @@
raise IndexError
return start + i * step
+ def getitems_int(self, w_list):
+ return self._getitems_range(w_list, False)
+
def getitem(self, w_list, i):
return self.wrap(self._getitem_unwrapped(w_list, i))
def getitems_copy(self, w_list):
return self._getitems_range(w_list, True)
- getitems_wrapped = getitems_copy
-
- def getitems_unwrapped(self, w_list):
- return self._getitems_range(w_list, False)
-
def getstorage_copy(self, w_list):
# tuple is unmutable
return w_list.lstorage
@@ -703,11 +709,6 @@
def getitems_copy(self, w_list):
return [self.wrap(item) for item in self.unerase(w_list.lstorage)]
- getitems_wrapped = getitems_copy
-
- def getitems_unwrapped(self, w_list):
- return self.unerase(w_list.lstorage)
-
@jit.unroll_safe
def getitems_unroll(self, w_list):
return [self.wrap(item) for item in self.unerase(w_list.lstorage)]
@@ -936,8 +937,6 @@
def getitems(self, w_list):
return self.unerase(w_list.lstorage)
- getitems_wrapped = getitems
-
class IntegerListStrategy(AbstractUnwrappedStrategy, ListStrategy):
_none_value = 0
_applevel_repr = "int"
@@ -965,6 +964,9 @@
if reverse:
l.reverse()
+ def getitems_int(self, w_list):
+ return self.unerase(w_list.lstorage)
+
class FloatListStrategy(AbstractUnwrappedStrategy, ListStrategy):
_none_value = 0.0
_applevel_repr = "float"
@@ -1022,7 +1024,6 @@
def getitems_str(self, w_list):
return self.unerase(w_list.lstorage)
-
# _______________________________________________________
init_signature = Signature(['sequence'], None, None)
diff --git a/pypy/objspace/std/objspace.py b/pypy/objspace/std/objspace.py
--- a/pypy/objspace/std/objspace.py
+++ b/pypy/objspace/std/objspace.py
@@ -440,6 +440,11 @@
return w_obj.getitems_str()
return None
+ def listview_int(self, w_obj):
+ if isinstance(w_obj, W_ListObject):
+ return w_obj.getitems_int()
+ return None
+
def sliceindices(self, w_slice, w_length):
if isinstance(w_slice, W_SliceObject):
a, b, c = w_slice.indices3(self, self.int_w(w_length))
diff --git a/pypy/objspace/std/setobject.py b/pypy/objspace/std/setobject.py
--- a/pypy/objspace/std/setobject.py
+++ b/pypy/objspace/std/setobject.py
@@ -13,8 +13,6 @@
from pypy.objspace.std.listobject import W_ListObject
from pypy.objspace.std.intobject import W_IntObject
from pypy.objspace.std.stringobject import W_StringObject
-from pypy.objspace.std.listobject import IntegerListStrategy, StringListStrategy,\
- EmptyListStrategy, RangeListStrategy, ObjectListStrategy, FloatListStrategy
class W_BaseSetObject(W_Object):
typedef = None
@@ -282,9 +280,6 @@
def get_empty_storage(self):
return self.erase(None)
- def get_storage_from_w_list(self, w_list):
- return self.get_empty_storage()
-
def is_correct_type(self, w_key):
return False
@@ -389,9 +384,7 @@
setdata[self.unwrap(w_item)] = None
return self.erase(setdata)
- def get_storage_from_w_list(self, w_list):
- items = w_list.strategy.getitems_unwrapped(w_list)
-
+ def get_storage_from_unwrapped_list(self, items):
setdata = self.get_empty_dict()
for item in items:
setdata[item] = None
@@ -759,14 +752,6 @@
def get_empty_storage(self):
return self.erase(self.get_empty_dict())
- def get_storage_from_w_list(self, w_list):
- items = w_list.strategy.getitems_wrapped(w_list)
-
- setdata = self.get_empty_dict()
- for item in items:
- setdata[item] = None
- return self.erase(setdata)
-
def get_empty_dict(self):
return newset(self.space)
@@ -904,22 +889,6 @@
def newset(space):
return r_dict(space.eq_w, space.hash_w, force_non_null=True)
-_strategy_map = {
- EmptyListStrategy: EmptySetStrategy,
- IntegerListStrategy: IntegerSetStrategy,
- RangeListStrategy: IntegerSetStrategy,
- StringListStrategy: StringSetStrategy,
- FloatListStrategy: ObjectSetStrategy,
- ObjectListStrategy: ObjectSetStrategy
-}
-
-def set_strategy_and_setdata_from_listobject(space, w_set, w_list):
- strategy_class = _strategy_map[w_list.strategy.__class__]
- strategy = space.fromcache(strategy_class)
-
- w_set.sstorage = strategy.get_storage_from_w_list(w_list)
- w_set.strategy = strategy
-
def set_strategy_and_setdata(space, w_set, w_iterable):
from pypy.objspace.std.intobject import W_IntObject
if w_iterable is None :
@@ -932,8 +901,18 @@
w_set.sstorage = w_iterable.get_storage_copy()
return
- if isinstance(w_iterable, W_ListObject):
- set_strategy_and_setdata_from_listobject(space, w_set, w_iterable)
+ stringlist = space.listview_str(w_iterable)
+ if stringlist != None:
+ strategy = space.fromcache(StringSetStrategy)
+ w_set.strategy = strategy
+ w_set.sstorage = strategy.get_storage_from_unwrapped_list(stringlist)
+ return
+
+ intlist = space.listview_int(w_iterable)
+ if intlist != None:
+ strategy = space.fromcache(IntegerSetStrategy)
+ w_set.strategy = strategy
+ w_set.sstorage = strategy.get_storage_from_unwrapped_list(intlist)
return
iterable_w = space.listview(w_iterable)
More information about the pypy-commit
mailing list