Skip to content

Instantly share code, notes, and snippets.

@nettle
Created July 18, 2019 12:38
Show Gist options
  • Save nettle/65b65b5498dde3ccaff4772ec8e0393a to your computer and use it in GitHub Desktop.
Save nettle/65b65b5498dde3ccaff4772ec8e0393a to your computer and use it in GitHub Desktop.
Python: string concatenation benchmark
"""
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