Ну, я не знаю, хотел бы я назвать это, используя его как «буфер», вы просто умножаете строку в 100 раз двумя сложными способами. Вот несложный способ:
def meth3(string):
return string * 100
Если мы добавим это к вашему тесту:
if __name__ == '__main__':
from timeit import Timer
string = "This is test string"
# Make sure it all does the same:
assert(meth1(string) == meth3(string))
assert(meth2(string) == meth3(string))
print(Timer("meth1(string)", "from __main__ import meth1, string").timeit())
print(Timer("meth2(string)", "from __main__ import meth2, string").timeit())
print(Timer("meth3(string)", "from __main__ import meth3, string").timeit())
В качестве бонуса оказывается намного быстрее:
21.0300650597
22.4869811535
0.811429977417
Если вы хотите создать связку строк, а затем соединить их, meth1 () - правильный путь. Нет смысла записывать его в StringIO, который является чем-то совершенно другим, а именно строкой с файловым интерфейсом потока.