Python: Sum string lengths

Viewed 25624

Is there a more idiomatic way to sum string lengths in Python than by using a loop?

length = 0
for string in strings:
    length += len(string)

I tried sum(), but it only works for integers:

>>> sum('abc', 'de')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sum() can't sum strings [use ''.join(seq) instead]
8 Answers

TLDR

If you care about performance use

len(''.join(strings))

else using map will suffice without sacrificing code readability or a lot of performance

sum(map(len, strings))

Performance metrics

Although I agree with the general consensus that when using Python your first priority should not be writing efficient and scalable code, I think it would be beneficial for this post to have some timings for the proposed answers.

Using the words from the first paragraph of lorem ipsum (list of strings excluded for the sake of brevity)

In [3]: timeit("""
    ...: length = 0
    ...: for s in strings:
    ...:     length += len(s)
    ...: """, globals=globals())
Out[3]: 5.197531974001322

In [4]: timeit("sum(len(s) for s in strings)", globals=globals())
Out[4]: 4.925184353021905

In [5]: timeit("sum(map(len, strings))", globals=globals())
Out[5]: 1.9876644779578783

In [6]: timeit("len(''.join(strings))", globals=globals())
Out[6]: 0.6793132669990882

So for large list of strings @Auspex is clearly to be prefered.

Related