diff options
author | Pablo Galindo <Pablogsal@gmail.com> | 2018-10-28 20:16:26 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-28 20:16:26 (GMT) |
commit | 372d705d958964289d762953d0a61622755f5386 (patch) | |
tree | f6a01b7f97739c53a8a99812ce690cbd7058588c /Lib/test/test_list.py | |
parent | 569d12f44847f18fc5b514b24e8ab901b0d96895 (diff) | |
download | cpython-372d705d958964289d762953d0a61622755f5386.zip cpython-372d705d958964289d762953d0a61622755f5386.tar.gz cpython-372d705d958964289d762953d0a61622755f5386.tar.bz2 |
bpo-33234 Improve list() pre-sizing for inputs with known lengths (GH-9846)
The list() constructor isn't taking full advantage of known input
lengths or length hints. This commit makes the constructor
pre-size and not over-allocate when the input size is known (the
input collection implements __len__). One on the main advantages is
that this provides 12% difference in memory savings due to the difference
between overallocating and allocating exactly the input size.
For efficiency purposes and to avoid a performance regression for small
generators and collections, the size of the input object is calculated using
__len__ and not __length_hint__, as the later is considerably slower.
Diffstat (limited to 'Lib/test/test_list.py')
-rw-r--r-- | Lib/test/test_list.py | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/Lib/test/test_list.py b/Lib/test/test_list.py index def4bad..c5002b1 100644 --- a/Lib/test/test_list.py +++ b/Lib/test/test_list.py @@ -1,5 +1,6 @@ import sys from test import list_tests +from test.support import cpython_only import pickle import unittest @@ -157,5 +158,13 @@ class ListTest(list_tests.CommonTest): with self.assertRaises(TypeError): (3,) + L([1,2]) + @cpython_only + def test_preallocation(self): + iterable = [0] * 10 + iter_size = sys.getsizeof(iterable) + + self.assertEqual(iter_size, sys.getsizeof(list([0] * 10))) + self.assertEqual(iter_size, sys.getsizeof(list(range(10)))) + if __name__ == "__main__": unittest.main() |