Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- ''' Speed tests of string concatenation with `+` vs `str.join()`
- Written by PM 2Ring 2015.10.01
- '''
- from __future__ import print_function
- import sys
- from timeit import Timer
- def concat_plus(lst):
- s = ''
- for u in lst:
- s += u
- return s
- def concat_plus_i(lst):
- s = ''
- for i in range(len(lst)):
- s += lst[i]
- return s
- def concat_join(lst):
- s = []
- for u in lst:
- s.append(u)
- return ''.join(s)
- def concat_join_i(lst):
- s = []
- for i in range(len(lst)):
- s.append(lst[i])
- return ''.join(s)
- def concat_join_lc(lst):
- return ''.join([u for u in lst])
- def concat_join_list(lst):
- return ''.join(lst)
- funcs = (
- concat_join_i,
- concat_join,
- concat_plus_i,
- concat_plus,
- concat_join_lc,
- concat_join_list,
- )
- def verify(lst):
- print('Verifying...')
- results = []
- for func in funcs:
- fname = func.func_name
- print('%s' % fname)
- s = func(lst)
- #print(s)
- results.append(s)
- s = results[0]
- if all(s==u for u in results):
- print('\nAll strings are equal\n')
- else:
- print('\nString mismatch error! Aborting.')
- exit()
- def time_test(loops, reps):
- ''' Print timing stats for all the functions '''
- for func in funcs:
- fname = func.func_name
- print('\n%s' % fname)
- setup = 'from __main__ import lst, ' + fname
- cmd = fname + '(lst)'
- t = Timer(cmd, setup)
- r = t.repeat(reps, loops)
- r.sort()
- print(r)
- if __name__ == "__main__":
- lo = int(sys.argv[1]) if len(sys.argv) > 1 else 2
- step = int(sys.argv[2]) if len(sys.argv) > 2 else 1
- base = sys.argv[3] if len(sys.argv) > 3 else 'abc'
- mult = int(sys.argv[4]) if len(sys.argv) > 4 else 1
- hi = lo + 5*step
- print('High string count = %d' % hi)
- base *= mult
- print('Base string length = %d' % len(base))
- all_strings = [base + str(i) for i in xrange(hi)]
- verify(all_strings)
- loops, reps = 100, 5
- print('Timing tests\nLoops = %d, Repetitions = %d' % (loops, reps))
- for i in xrange(lo, hi + step, step):
- lst = all_strings[:i]
- print('\n*** %2d strings ***' % i)
- time_test(loops, reps)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement