Попробуйте это:
word="this is a lower case string"
caps = word.upper()
''.join(x[random.randint(0,1)] for x in zip(word, caps))
Это должно превзойти вашу версию, потому что она делает намного меньше вызовов на upper
и потому, что, что более важно, избегает O (N ^ 2) последовательных добавлений, которые вы использовали вверсия с петлями.
С изменением вопроса вам нужно будет создать как строчные, так и прописные версии:
word="This is a MixeD cAse stRing"
caps = word.upper()
lowers = word.lower()
''.join(random.choice(x) for x in zip(caps, lowers))
Как подсказал Тим Пицкер в комментариях, я использовал random.choice
чтобы выбрать буквы из кортежей, созданных с помощью вызова zip
.
Поскольку вопрос был изменен, чтобы больше сосредоточиться на скорости, наиболее быстрый подход, вероятно, будет использовать Numpy:
''.join(numpy.where(numpy.random.randint(2, size=len(caps)), list(caps), list(lowers)))