Apply pre-sizing optimization to a broader class of objects.
Formerly, the length was only fetched from sequence objects.
Now, any object that reports its length can benefit from pre-sizing.
diff --git a/Objects/abstract.c b/Objects/abstract.c
index 1259ad4..342d971 100644
--- a/Objects/abstract.c
+++ b/Objects/abstract.c
@@ -1448,15 +1448,11 @@
 		return NULL;
 
 	/* 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 */
+	}
 	result = PyList_New(n);
 	if (result == NULL) {
 		Py_DECREF(it);
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 7fc6f57..a17c6d9 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -153,15 +153,11 @@
 		return NULL;
 
 	/* Guess a result list size. */
-	len = -1;   /* unknown */
-	if (PySequence_Check(seq) &&
-	    seq->ob_type->tp_as_sequence->sq_length) {
-		len = PySequence_Size(seq);
-		if (len < 0)
-			PyErr_Clear();
+	len = PyObject_Size(seq);
+	if (len < 0) {
+		PyErr_Clear();
+		len = 8;	/* arbitrary */
 	}
-	if (len < 0)
-		len = 8;  /* arbitrary */
 
 	/* Pre-allocate argument list tuple. */
 	arg = PyTuple_New(1);