Created
July 18, 2019 12:38
-
-
Save nettle/65b65b5498dde3ccaff4772ec8e0393a to your computer and use it in GitHub Desktop.
Python: string concatenation benchmark
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
String concatenation benchmark | |
Standard python string concatenation | |
vs custom (StringStream based on StringIO) | |
vs io streams (cStringIO, StringIO, io.BytesIO) | |
Test text: https://www.lipsum.com/ | |
Word wrap: https://appzaza.com/word-wrap | |
""" | |
import StringIO | |
class StringStream(object): | |
"""Custom string stream class""" | |
def __init__(self, stream=False): | |
if stream: | |
self.stream = stream | |
else: | |
self.stream = StringIO.StringIO() | |
def __enter__(self): | |
return self | |
def __exit__(self, tipe, value, traceback): | |
self.close() | |
def close(self): | |
"""Close stream""" | |
self.stream.close() | |
def write(self, data): | |
"""Writes data to file""" | |
self.stream.write(data) | |
def getvalue(self): | |
"""Return result value""" | |
return self.stream.getvalue() | |
def __iadd__(self, data): | |
"""Override += operator""" | |
self.write(data) | |
return self | |
def __call__(self): | |
"""Override () operator""" | |
return self.getvalue() | |
def usage_(): | |
with StringStream() as stream: | |
stream.write("one\n") | |
stream += "two\n" | |
stream += """three | |
four | |
five | |
""" | |
return stream() | |
TEST_STRING0 = """ | |
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque tempor ex | |
non quam ultrices lobortis. Mauris aliquam ipsum dolor, nec euismod tortor | |
accumsan ut. Morbi at sapien elit. Vestibulum gravida ante tellus, vitae | |
iaculis lorem accumsan at. Aenean consequat libero mi, id volutpat lacus | |
faucibus eget. Sed vitae nisi et diam facilisis sagittis. Morbi lacinia maximus | |
eros et porttitor. Vivamus vulputate, enim et accumsan sagittis, dui ante | |
ultrices est, id tincidunt ipsum nisi non ante. Aliquam congue, orci sed | |
interdum porttitor, nisi metus iaculis magna, sed dignissim magna leo in justo. | |
Vestibulum maximus facilisis tincidunt. Mauris neque dolor, sodales a enim ac, | |
lacinia tincidunt mi. Donec vitae est ante. Ut purus orci, posuere et elit a, | |
molestie viverra ipsum. Donec placerat orci id scelerisque vestibulum. Nunc et | |
urna maximus, pellentesque dui non, tincidunt erat. Sed porta sollicitudin | |
vestibulum. In hac habitasse platea dictumst. Cras molestie, leo sed placerat | |
varius, arcu diam molestie urna, sit amet hendrerit turpis lectus sed purus. | |
Nunc condimentum hendrerit elit vitae tristique. Nunc vestibulum erat ac libero | |
tincidunt volutpat. Fusce rutrum scelerisque mattis. Suspendisse potenti. Morbi | |
pellentesque faucibus placerat. Cras ligula odio, vulputate ac purus at, | |
commodo sagittis dolor. Orci varius natoque penatibus et magnis dis parturient | |
montes, nascetur ridiculus mus. Nam porta efficitur justo nec suscipit. | |
Suspendisse sed dolor eget odio commodo sagittis nec molestie urna. Donec in | |
eros sed nulla sollicitudin imperdiet ac et turpis. Etiam malesuada tellus mi, | |
a scelerisque tellus varius sed. Nulla euismod eu magna et euismod. Praesent | |
sed porttitor metus. Nulla aliquam, nisl sollicitudin efficitur tempor, ex nunc | |
interdum justo, a ullamcorper orci mauris sit amet lacus. | |
Proin vel viverra libero, eu ornare mi. Mauris a tincidunt enim. Aenean gravida | |
dapibus lectus, vel condimentum sem pellentesque nec. Mauris nec congue metus. | |
Fusce laoreet et metus eu tincidunt. Vestibulum pellentesque lacinia turpis non | |
bibendum. Duis vitae est metus. Sed semper, ex imperdiet efficitur tempor, urna | |
justo porttitor orci, a iaculis velit ligula in metus. Pellentesque elit est, | |
gravida sed enim a, dignissim ultricies massa. Quisque vitae feugiat ante. | |
Integer laoreet iaculis aliquet. Donec semper, quam in interdum laoreet, erat | |
ex ultrices felis, non pellentesque urna lorem vitae lorem. Vestibulum posuere | |
imperdiet dui sed posuere. In ornare, erat ac malesuada faucibus, libero mauris | |
egestas leo, nec commodo quam turpis vitae ex. Maecenas varius turpis pretium | |
lorem pellentesque faucibus. Phasellus at tellus enim. Nulla nec dictum leo. | |
Suspendisse dolor nisl, viverra ac ultricies eget, elementum id tellus. Donec | |
in sapien quis mauris interdum mollis ac ac mauris. Aliquam porttitor justo ac | |
ex ornare, non condimentum mauris posuere. Maecenas gravida sapien eu purus | |
posuere, eget sagittis enim interdum. Morbi nisi sem, auctor a convallis sit | |
amet, fringilla ac lorem. Morbi tincidunt eleifend venenatis. Phasellus | |
elementum purus orci, a semper felis imperdiet nec. | |
Aenean et feugiat leo, in eleifend sapien. Etiam vehicula, felis eget | |
pellentesque auctor, augue urna vehicula erat, non elementum enim orci ut est. | |
Phasellus vulputate vestibulum nulla, nec gravida purus faucibus id. Ut quis | |
urna nec velit luctus pharetra sed vitae velit. Fusce sagittis, lorem aliquam | |
dapibus faucibus, dui nisl maximus diam, in interdum tellus leo a sapien. | |
Phasellus quis commodo magna, eget commodo sem. Curabitur sagittis sem at dolor | |
elementum, vel consequat diam varius. Orci varius natoque penatibus et magnis | |
dis parturient montes, nascetur ridiculus mus. Sed dictum sed erat eu luctus. | |
Ut nulla ante, fermentum cursus dolor non, vestibulum tempor mi. Fusce sit amet | |
nisl vulputate, rutrum odio vel, fermentum elit. Maecenas ac justo imperdiet, | |
sollicitudin ante id, venenatis elit. Curabitur neque dui, eleifend sed | |
hendrerit at, placerat a nunc. | |
Sed gravida augue rutrum lectus congue, ac pretium diam lobortis. Vestibulum | |
ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; | |
Donec eget euismod metus. Nulla pellentesque placerat enim, a consequat libero | |
efficitur ac. Aliquam erat volutpat. In elementum ante sollicitudin semper | |
ultricies. Sed euismod ut nunc eu posuere. Nam aliquet ornare quam at faucibus. | |
Pellentesque egestas dapibus nunc non feugiat. Maecenas pharetra quam vel | |
tempus feugiat. Integer molestie quam ultrices euismod venenatis. Nunc | |
fermentum vestibulum scelerisque. Sed faucibus elementum nibh nec imperdiet. In | |
quis pretium mi. Nullam efficitur nunc vel ipsum sagittis auctor. | |
Suspendisse vitae blandit erat. Donec iaculis urna non massa sodales, at | |
ultricies leo mattis. Proin malesuada ultricies iaculis. Vivamus bibendum | |
maximus quam, eu ornare dolor ultricies a. Donec cursus, odio varius mattis | |
consectetur, arcu nunc dignissim odio, sit amet feugiat felis dolor in ipsum. | |
Proin nisl lorem, gravida at eleifend cursus, ullamcorper volutpat sem. Aliquam | |
iaculis, mi vel elementum mattis, sem libero mattis mauris, in ultrices dolor | |
felis vel magna. Phasellus elementum sed tortor vitae rhoncus. In tincidunt | |
ultrices arcu eu imperdiet. | |
Ut est augue, porta quis placerat in, maximus eget justo. Integer tincidunt | |
luctus arcu, non fringilla tortor commodo suscipit. Vestibulum ante ipsum | |
primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nunc congue | |
porttitor augue eget rutrum. Etiam blandit quam a velit dignissim, quis feugiat | |
nisi viverra. Mauris pellentesque dolor at mauris euismod faucibus. Fusce | |
cursus vel turpis non facilisis. Donec gravida, lectus non lobortis ultricies, | |
felis risus rhoncus tellus, ac venenatis metus turpis in elit. Nulla at nibh ut | |
sem dignissim euismod dapibus eu lorem. Morbi elit sem, euismod dapibus tortor | |
eget, feugiat mollis nulla. Vestibulum at erat ultricies massa ullamcorper | |
hendrerit. Donec efficitur porta lacinia. Integer maximus lectus non blandit | |
pulvinar. Integer hendrerit dignissim tellus, ac hendrerit arcu vehicula quis. | |
Nullam in velit tellus. Vestibulum ante ipsum primis in faucibus orci luctus et | |
ultrices posuere cubilia Curae; Pellentesque habitant morbi tristique senectus | |
et netus et malesuada fames ac turpis egestas. Curabitur elementum ligula vel | |
tellus sagittis scelerisque. Morbi in elit et erat iaculis tincidunt. Nulla a | |
aliquam neque, in ornare nisi. Duis vel blandit tortor. Nam commodo, augue at | |
consequat sodales, metus metus porta enim, quis mollis erat est nec purus. | |
Aliquam fermentum neque vitae arcu tincidunt tempus. Etiam luctus venenatis | |
lectus, id malesuada mauris mollis nec. Etiam eu orci fringilla, hendrerit est | |
non, ullamcorper risus. Curabitur sodales tellus massa, eu laoreet nunc | |
vehicula sit amet. Integer ligula sapien, tincidunt vitae lacus ut, ullamcorper | |
sodales nisi. Suspendisse id nisl sed mauris feugiat ornare nec id erat. | |
Praesent hendrerit mauris at pharetra interdum. | |
Sed iaculis, dolor vitae gravida rhoncus, felis ipsum sagittis nibh, vitae | |
faucibus odio nisi ut ante. Suspendisse potenti. Quisque vel rhoncus eros. | |
Mauris sit amet feugiat arcu, at euismod neque. Donec a orci in mi egestas | |
iaculis. Etiam bibendum risus eu tellus tincidunt, in pulvinar nulla iaculis. | |
Sed ipsum nisl, rhoncus ut nisl nec, feugiat accumsan quam. Donec at felis | |
dapibus, convallis ante a, feugiat erat. Aliquam commodo augue vitae vulputate | |
dapibus. Sed elementum metus id pretium fringilla. Aenean mollis, dolor ut | |
faucibus ornare, justo magna dignissim nunc, quis dictum metus nibh non elit. | |
Pellentesque purus elit, tristique vel odio quis, elementum gravida erat. | |
Aliquam elementum vel lorem vitae vehicula. | |
Integer nisl justo, sollicitudin vitae lorem ac, luctus ornare est. Sed | |
interdum ornare turpis, vel ullamcorper lacus vulputate non. Phasellus | |
ultricies lacinia mauris sed facilisis. Phasellus laoreet viverra dui nec | |
ultrices. Cras erat turpis, posuere ac rhoncus eget, vulputate sed dolor. | |
Pellentesque euismod semper bibendum. Ut faucibus, massa ac tempor blandit, | |
augue metus gravida odio, in accumsan metus lorem a justo. Cras lectus ante, | |
aliquet vitae hendrerit euismod, porta id metus. Fusce consequat interdum | |
vestibulum. Donec egestas, justo laoreet laoreet vulputate, velit elit faucibus | |
tortor, eget eleifend leo lacus id est. Nunc rhoncus ligula non egestas | |
pellentesque. Fusce dictum at purus sit amet volutpat. Sed ornare cursus purus, | |
nec posuere risus iaculis vitae. Phasellus vulputate leo velit, vel accumsan | |
mauris suscipit id. Fusce sagittis convallis felis, nec venenatis orci | |
malesuada a. | |
Nam aliquam sodales risus, et eleifend purus placerat non. In hac habitasse | |
platea dictumst. Proin aliquet metus eu enim ullamcorper, at posuere leo | |
tincidunt. Suspendisse ut finibus ligula. Sed semper purus eu enim volutpat | |
ullamcorper. Curabitur malesuada, dolor a commodo tincidunt, tellus nunc | |
interdum velit, ut viverra justo nisl a neque. Nam nec odio et libero vehicula | |
semper in sit amet tortor. | |
Nunc aliquet sagittis urna, sollicitudin dapibus orci interdum id. Duis lorem | |
neque, maximus ut dui a, porttitor elementum nisl. Vestibulum risus massa, | |
ornare sed diam nec, sollicitudin venenatis eros. Praesent tincidunt lectus | |
quis diam malesuada, in finibus augue pretium. Etiam eu sollicitudin eros. | |
Aenean sodales, diam id hendrerit dapibus, quam mauris pretium augue, ac | |
fermentum risus nulla ac nulla. Maecenas tristique magna vitae dictum lobortis. | |
Phasellus tristique sapien nec massa porta, id dictum justo mollis. Quisque | |
blandit diam at leo varius, non mollis augue aliquam. Sed vel libero mi. | |
Integer in nisi nulla. Nulla scelerisque velit nec purus pellentesque, quis | |
mollis tellus ornare. Curabitur mollis maximus purus, a sagittis ante dapibus | |
ut. | |
Maecenas sed dolor eros. Ut ullamcorper pharetra urna nec mattis. Nunc | |
facilisis, urna quis vulputate lacinia, justo eros elementum orci, in aliquam | |
nunc nibh at sapien. Quisque id ligula aliquet enim dictum hendrerit. Sed | |
finibus, lacus et semper interdum, nunc justo congue augue, sit amet malesuada | |
lectus eros non mi. Morbi lectus mi, pharetra et metus nec, congue congue | |
lorem. Vivamus commodo rutrum risus, quis malesuada orci tincidunt vel. | |
Praesent nulla ipsum, facilisis a enim in, porta faucibus massa. Fusce ultrices | |
faucibus purus, vel ultrices mi auctor sit amet. Donec a arcu vitae erat | |
eleifend pharetra. Nunc suscipit arcu ultrices, iaculis ex sed, luctus purus. | |
Mauris maximus lectus vel condimentum sodales. Aenean lacinia felis suscipit, | |
finibus odio vel, posuere neque. Vivamus id commodo purus. Phasellus egestas | |
fermentum sapien vitae accumsan. Morbi varius quam eget mi aliquet, sed | |
faucibus ipsum laoreet. Donec lobortis tristique porta. Ut suscipit nec arcu | |
eget imperdiet. Quisque ac metus efficitur, interdum eros quis, facilisis eros. | |
Nullam sed sagittis quam. Curabitur purus lectus, iaculis non venenatis in, | |
eleifend eget justo. Praesent a velit faucibus, feugiat nisi quis, iaculis | |
sapien. In efficitur ipsum at arcu pharetra, non vestibulum metus rhoncus. | |
Duis pharetra, risus vel hendrerit egestas, eros sem lobortis urna, eget | |
vehicula mauris elit at turpis. Praesent ipsum urna, semper sed metus nec, | |
ultricies posuere erat. Morbi condimentum auctor malesuada. Praesent at dolor | |
sed leo laoreet aliquet. Fusce vehicula dui et imperdiet ornare. Fusce luctus | |
imperdiet sapien, vitae placerat lacus laoreet ut. Duis lacus nulla, volutpat | |
vel fermentum vitae, aliquam et sem. Nam feugiat quis tellus sit amet sagittis. | |
Vestibulum et est dignissim, consequat eros ac, rutrum turpis. Aenean eget elit | |
dolor. Praesent sit amet ligula ornare, pulvinar magna at, sagittis orci. Ut | |
interdum lacus vitae dui faucibus, non euismod dui placerat. | |
Quisque eu magna quis sapien varius hendrerit. In hac habitasse platea | |
dictumst. Phasellus accumsan orci nec sapien blandit, sit amet hendrerit elit | |
consequat. Nunc sed sapien id odio ornare facilisis id ut mauris. Ut ut felis | |
purus. Morbi ut posuere odio, a rutrum diam. Curabitur accumsan ultricies | |
sagittis. Morbi dignissim sem imperdiet erat sollicitudin, eget convallis | |
turpis lacinia. Aliquam mattis eleifend orci, sagittis faucibus ipsum volutpat | |
a. Morbi et orci consequat, scelerisque ex id, vehicula dui. Maecenas viverra | |
metus scelerisque, aliquet purus eu, consequat ligula. Sed quis massa | |
tincidunt, venenatis sem vitae, finibus nunc. Nunc consectetur nisl quam, vel | |
pharetra urna mattis a. Proin et imperdiet elit, sit amet tincidunt justo. | |
Vivamus vestibulum fringilla pellentesque. | |
Sed elementum neque at iaculis pretium. Duis vel dolor condimentum, | |
pellentesque libero id, tristique ex. Duis ut erat suscipit, ornare risus eu, | |
volutpat lorem. Nulla accumsan gravida risus ut varius. Nullam sit amet risus | |
dignissim lacus congue ultrices. Quisque blandit orci quis lacus dignissim, | |
efficitur rhoncus nisi interdum. Nunc consequat vulputate erat non egestas. | |
Curabitur pellentesque diam ipsum, sit amet scelerisque mauris egestas quis. | |
Sed venenatis nec risus vel imperdiet. Donec nec commodo velit, quis blandit | |
mi. Aliquam purus tortor, dapibus sed ornare sit amet, tempus ac purus. | |
Vestibulum id diam quam. Morbi blandit congue enim. Praesent erat sapien, | |
facilisis in felis condimentum, semper consequat enim. Cras fermentum nisl | |
vitae tempus efficitur. Donec lectus orci, varius quis felis quis, consectetur | |
volutpat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. | |
Fusce tincidunt pulvinar arcu lobortis egestas. Mauris condimentum metus | |
lectus, sed pharetra elit commodo sed. Interdum et malesuada fames ac ante | |
ipsum primis in faucibus. Integer maximus elit id auctor porta. | |
Cras tempus et enim et semper. Nulla quis porttitor nisl. Phasellus malesuada | |
posuere turpis, non volutpat nisl cursus et. Donec lacus orci, congue in | |
commodo sit amet, lobortis non metus. In nec neque consectetur, cursus lorem a, | |
egestas nisi. Praesent eget est vel elit feugiat commodo. Pellentesque habitant | |
morbi tristique senectus et netus et malesuada fames ac turpis egestas. | |
Suspendisse congue dui et enim tincidunt commodo. Aenean et sem id enim | |
volutpat auctor sit amet ut nisl. Suspendisse ullamcorper nec justo a euismod. | |
Ut sit amet neque eget augue dapibus lobortis. Donec feugiat justo lectus, at | |
ullamcorper diam luctus eget. Maecenas volutpat varius libero eu egestas. | |
Duis vitae tincidunt nunc, quis porttitor dui. Nunc risus orci, mattis vel | |
lacinia ac, dictum sed tortor. Phasellus fermentum rutrum elit. Donec bibendum | |
tellus quis justo venenatis, vel posuere ante consectetur. Aenean at lorem eu | |
ligula varius eleifend quis eu urna. Nam pharetra pretium ante mattis tempor. | |
Donec sed sagittis turpis. Aliquam aliquam facilisis mattis. | |
Integer et orci eros. Duis interdum placerat euismod. Phasellus sed consequat | |
risus, tincidunt porttitor felis. Cras molestie, dolor a euismod hendrerit, | |
turpis nisl bibendum ante, in bibendum enim ante eget magna. Nulla tristique | |
lorem ac massa elementum, sed ultricies diam metus. | |
""" | |
TEST_STRING1 = "." * 2 ** 10 | |
TEST_STRING2 = "0123456789ABCDEF" * 2 ** 8 | |
TEST_REPEAT = 10000 | |
def getstr(): | |
return TEST_STRING0 | |
# return TEST_STRING1 | |
# return TEST_STRING2 | |
def measure(func): | |
import timeit | |
start = timeit.default_timer() | |
func() | |
end = timeit.default_timer() | |
return end - start | |
def test1(): | |
asm = "" | |
for _ in range(TEST_REPEAT): | |
asm += getstr() | |
return asm | |
def test2(): | |
with StringStream() as asm: | |
for _ in range(TEST_REPEAT): | |
asm += getstr() | |
return asm() | |
def test3(): | |
import cStringIO | |
asm = cStringIO.StringIO() | |
for _ in range(TEST_REPEAT): | |
asm.write(getstr()) | |
return asm.getvalue() | |
def test4(): | |
import StringIO | |
asm = StringIO.StringIO() | |
for _ in range(TEST_REPEAT): | |
asm.write(getstr()) | |
return asm.getvalue() | |
def test5(): | |
import io | |
asm = io.BytesIO() | |
for _ in range(TEST_REPEAT): | |
asm.write(getstr()) | |
return asm.getvalue() | |
def main(): | |
print "Running benchmark..." | |
print "%d concatenations of %d bytes string\n" % (TEST_REPEAT, len(getstr())) | |
# Warm up | |
if False: | |
test1() | |
test2() | |
test3() | |
test4() | |
test5() | |
def memory(): | |
import resource | |
return resource.getrusage(resource.RUSAGE_SELF).ru_maxrss * resource.getpagesize() / 1024 / 1024 | |
result1 = measure(test1) | |
result2 = measure(test2) | |
result3 = measure(test3) | |
result4 = measure(test4) | |
result5 = measure(test5) | |
def print_result(title, result, base): | |
percent = result * 100.0 / base | |
print "{0:30s}: {1:.1f}% ({2:.0f} ms)".format(title, percent, result * 1000) | |
print_result("String concatenation", result1, result1) | |
print_result("Custom StringStream", result2, result1) | |
print_result("cStringIO", result3, result1) | |
print_result("StringIO", result4, result1) | |
print_result("io.BytesIO", result5, result1) | |
if __name__ == "__main__": | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment