weird side note: str.join is faster with a list comprehension than a generator expression, because it has to generate a list regardless.