Skip to content

Commit 88bdb92

Browse files
serhiy-storchakaDinoV
authored andcommitted
bpo-36781: Optimize sum() for bools. (#13074)
* Optimize sum() for bools. * Fix sum([], False). * Add a NEWS entry.
1 parent c1d8c1c commit 88bdb92

File tree

3 files changed

+24
-2
lines changed

3 files changed

+24
-2
lines changed

Lib/test/test_builtin.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1373,6 +1373,24 @@ def test_sum(self):
13731373

13741374
self.assertEqual(sum(range(10), 1000), 1045)
13751375
self.assertEqual(sum(range(10), start=1000), 1045)
1376+
self.assertEqual(sum(range(10), 2**31-5), 2**31+40)
1377+
self.assertEqual(sum(range(10), 2**63-5), 2**63+40)
1378+
1379+
self.assertEqual(sum(i % 2 != 0 for i in range(10)), 5)
1380+
self.assertEqual(sum((i % 2 != 0 for i in range(10)), 2**31-3),
1381+
2**31+2)
1382+
self.assertEqual(sum((i % 2 != 0 for i in range(10)), 2**63-3),
1383+
2**63+2)
1384+
self.assertIs(sum([], False), False)
1385+
1386+
self.assertEqual(sum(i / 2 for i in range(10)), 22.5)
1387+
self.assertEqual(sum((i / 2 for i in range(10)), 1000), 1022.5)
1388+
self.assertEqual(sum((i / 2 for i in range(10)), 1000.25), 1022.75)
1389+
self.assertEqual(sum([0.5, 1]), 1.5)
1390+
self.assertEqual(sum([1, 0.5]), 1.5)
1391+
self.assertEqual(repr(sum([-0.0])), '0.0')
1392+
self.assertEqual(repr(sum([-0.0], -0.0)), '-0.0')
1393+
self.assertEqual(repr(sum([], -0.0)), '-0.0')
13761394

13771395
self.assertRaises(TypeError, sum)
13781396
self.assertRaises(TypeError, sum, 42)
@@ -1384,6 +1402,9 @@ def test_sum(self):
13841402
self.assertRaises(TypeError, sum, [[1], [2], [3]])
13851403
self.assertRaises(TypeError, sum, [{2:3}])
13861404
self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1405+
self.assertRaises(TypeError, sum, [], '')
1406+
self.assertRaises(TypeError, sum, [], b'')
1407+
self.assertRaises(TypeError, sum, [], bytearray())
13871408

13881409
class BadSeq:
13891410
def __getitem__(self, index):
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
:func:`sum` has been optimized for boolean values.

Python/bltinmodule.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2342,7 +2342,7 @@ builtin_sum_impl(PyObject *module, PyObject *iterable, PyObject *start)
23422342
return NULL;
23432343
return PyLong_FromLong(i_result);
23442344
}
2345-
if (PyLong_CheckExact(item)) {
2345+
if (PyLong_CheckExact(item) || PyBool_Check(item)) {
23462346
long b = PyLong_AsLongAndOverflow(item, &overflow);
23472347
if (overflow == 0 &&
23482348
(i_result >= 0 ? (b <= LONG_MAX - i_result)
@@ -2390,7 +2390,7 @@ builtin_sum_impl(PyObject *module, PyObject *iterable, PyObject *start)
23902390
Py_DECREF(item);
23912391
continue;
23922392
}
2393-
if (PyLong_CheckExact(item)) {
2393+
if (PyLong_Check(item)) {
23942394
long value;
23952395
int overflow;
23962396
value = PyLong_AsLongAndOverflow(item, &overflow);

0 commit comments

Comments
 (0)