[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