Apply tuple/list pre-sizing optimization to a broader class of objects.
Formerly, length data fetched from sequence objects.
Now, any object that reports its length can benefit from pre-sizing.

On one sample timing, it gave a threefold speedup for list(s) where s
was a set object.
diff --git a/Objects/abstract.c b/Objects/abstract.c
index 7e246db..1259ad4 100644
--- a/Objects/abstract.c
+++ b/Objects/abstract.c
@@ -1380,7 +1380,7 @@
 		return NULL;
 
 	/* Guess result size and allocate space. */
-	n = PySequence_Size(v);
+	n = PyObject_Size(v);
 	if (n < 0) {
 		PyErr_Clear();
 		n = 10;  /* arbitrary */
diff --git a/Objects/listobject.c b/Objects/listobject.c
index 47673be..3397fbb 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -2266,15 +2266,11 @@
 		return -1;
 
 	/* Guess a result list size. */
-	n = -1;	 /* unknown */
-	if (PySequence_Check(v) &&
-	    v->ob_type->tp_as_sequence->sq_length) {
-		n = PySequence_Size(v);
-		if (n < 0)
-			PyErr_Clear();
-	}
-	if (n < 0)
+	n = PyObject_Size(v);
+	if (n < 0) {
+		PyErr_Clear();
 		n = 8;	/* arbitrary */
+	}
 	NRESIZE(result->ob_item, PyObject*, n);
 	if (result->ob_item == NULL) {
 		PyErr_NoMemory();