[issue19513] Use PyUnicodeWriter instead of PyAccu in repr(tuple) and repr(list)

STINNER Victor report at bugs.python.org
Thu Nov 7 09:10:44 CET 2013


STINNER Victor added the comment:

I tried different overallocator factors:

* writer (current factor): 25% (1/4)
* writer50: 50% (1/2)
* writer100: 100% (double the buffer)

-----------------------------+-------------+----------------+---------------
Tests                        |      writer |       writer50 |      writer100
-----------------------------+-------------+----------------+---------------
list("a")                    |  588 ns (*) |         571 ns |   640 ns (+9%)
list("abc")                  |  844 ns (*) |         842 ns |         806 ns
["a"]*(100)                  |  9.3 us (*) |        9.13 us |        9.31 us
["abc"]*(100)                | 10.3 us (*) |        10.1 us |        9.86 us
["a" * 100]*(100)            | 39.1 us (*) |        38.4 us |        38.3 us
["a"]*(10**6)                | 91.2 ms (*) |        88.4 ms |        91.8 ms
["abc"]*(10**6)              |  103 ms (*) |        99.7 ms |  95.6 ms (-8%)
["a" * 100]*(10**5)          | 58.8 ms (*) | 49.4 ms (-16%) | 46.7 ms (-21%)
list(range(10**6))           |  152 ms (*) |   144 ms (-5%) |   142 ms (-7%)
list(map(str, range(10**6))) |  124 ms (*) |   112 ms (-9%) |   114 ms (-8%)
-----------------------------+-------------+----------------+---------------
Total                        |  530 ms (*) |   494 ms (-7%) |   490 ms (-8%)
-----------------------------+-------------+----------------+---------------

The best factor looks to be 50%.

With a factor lower than 25%, performances are worse :

* writer: 25% (1/4)
* writer12: 12.5% (1/8)

-----------------------------+-------------+---------------
Tests                        |      writer |       writer12
-----------------------------+-------------+---------------
list("a")                    |  588 ns (*) |         565 ns
list("abc")                  |  844 ns (*) |         814 ns
["a"]*(100)                  |  9.3 us (*) |         9.5 us
["abc"]*(100)                | 10.3 us (*) |        10.8 us
["a" * 100]*(100)            | 39.1 us (*) |  42.4 us (+8%)
["a"]*(10**6)                | 91.2 ms (*) |    96 ms (+5%)
["abc"]*(10**6)              |  103 ms (*) |   112 ms (+8%)
["a" * 100]*(10**5)          | 58.8 ms (*) | 78.5 ms (+33%)
list(range(10**6))           |  152 ms (*) |   160 ms (+5%)
list(map(str, range(10**6))) |  124 ms (*) |  137 ms (+10%)
-----------------------------+-------------+---------------
Total                        |  530 ms (*) |  583 ms (+10%)
-----------------------------+-------------+---------------

PyAccu vs PyUnicodeWriter (overallocate 50%):

-----------------------------+-------------+---------------
Tests                        |      pyaccu |       writer50
-----------------------------+-------------+---------------
list("a")                    |  713 ns (*) |  571 ns (-20%)
list("abc")                  |  984 ns (*) |  842 ns (-14%)
["a"]*(100)                  |   12 us (*) | 9.13 us (-24%)
["abc"]*(100)                | 12.6 us (*) | 10.1 us (-20%)
["a" * 100]*(100)            | 38.7 us (*) |        38.4 us
["a"]*(10**6)                |  111 ms (*) | 88.4 ms (-21%)
["abc"]*(10**6)              |  120 ms (*) | 99.7 ms (-17%)
["a" * 100]*(10**5)          | 51.9 ms (*) |        49.4 ms
list(range(10**6))           |  165 ms (*) |  144 ms (-13%)
list(map(str, range(10**6))) |  139 ms (*) |  112 ms (-19%)
-----------------------------+-------------+---------------
Total                        |  588 ms (*) |  494 ms (-16%)
-----------------------------+-------------+---------------

So using 50%, PyUnicodeWriter is always faster on Windows.

----------

_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue19513>
_______________________________________


More information about the Python-bugs-list mailing list