[Pythonクイズ]たくさんの文字列を+=演算子で結合するつもりなの? もっと良い方法ってありますよね!Pythonステップアップクイズ

文字列には+=演算子があって、これを使えば、カンタンに2つの文字列を結合できますよね。でも、使い過ぎには注意が必要です。たくさんの文字列をサクッと結合する方法、分かりますか?

» 2025年04月15日 05時00分 公開
[かわさきしんじDeep Insider編集部]
「Pythonステップアップクイズ」のインデックス

連載目次

+=演算子による文字列の結合は分かりやすいけれど…… +=演算子による文字列の結合は分かりやすいけれど……

【問題】

 以下はリストwordsに格納されている文字列要素を結合して、その結果は変数resultに代入するコードだ。このコードは何をするかが一目瞭然で分かりやすいといえる。これよりも良い記述方法を考えてみよう。

words = ['foo', 'bar', 'baz', 'qux', 'quux']
result = ''

for word in words:
    result += word

print(result)

+=演算子による文字列の結合

かわさき

 どうもHPかわさきです。

 前回は「三寒四温……」みたいなことを書きました。原稿を書いている段階ではそんな日が続いていたんですよ。でも、いざ記事を公開する頃には「ちょっと寒いね」と感じることもなくなってしまって微妙にズレた感じのつぶやきになってしまいました。ホント、季節が巡るのは速いですねぇ。このまま、今年もあっという間に暮れていくんでしょう。そういうわけで、良いお年をお迎えくださいね(いくら何でも早過ぎないかい?)。


【答え】

 以下に正解のコード例を示します。

words = ['foo', 'bar', 'baz', 'qux', 'quux']

result = ''.join(words)

print(result)

文字列のjoinメソッドを使うのがオススメ!

 文字列にはjoinメソッドがあります。これは引数として与えた反復可能オブジェクトの文字列要素を、そのメソッドの呼び出しで使用した文字列を区切り文字として使って結合するものです。上のコード例では、空文字列「''」が区切り文字なので、実際にはリストの要素がそのまま結合されて「foobarbazquxquux」という文字列が得られます。

 他にもやり方はあるでしょうが、ここでは正解例として上のコードを挙げました。

速度の面でも消費するメモリの面でもjoinメソッドがオススメ! 速度の面でも消費するメモリの面でもjoinメソッドがオススメ!

【解説】

 問題文のコードは次のようなものでした。

words = ['foo', 'bar', 'baz', 'qux', 'quux']
result = ''

for word in words:
    result += word

print(result)

+=演算子で文字列を結合するたびに新たな文字列が作成される

 +=演算子による文字列の結合は分かりやすいのですが、問題点もあります。Pythonの文字列はイミュータブル(変更不可能)なオブジェクトです。つまり、for文の中で「result += word」行が実行されるたびに「新たな文字列オブジェクトが作成され、以前の文字列は捨てられる」という非効率的な処理が行われているのです。これは処理速度の面でもメモリの消費量という面でもあまりよろしくはないでしょう。

 一方、joinメソッドには次のような特徴があります。

  • C言語で実装されている
  • 結合後の文字列の長さをあらかじめ計算して、必要なメモリを事前に確保する
  • その後、区切り文字やリストの要素をそこにコピーしていく

 こうした特徴から+=演算子で文字列を何度も結合していくよりも、処理速度/メモリ消費量の両面で効率的なやり方だといえます。

 実際に試してみましょう。問題文のコードではその差が見えにくいかもしれないので、以下では10万個の文字列要素を持つリストを例として見ます。

from time import time

words = ['foo'] * 100000
result = ''

st = time()
for word in words:
    result += word
ed = time()

print(f'by += op: {ed - st}')

st = time()
result = ''.join(words)
ed = time()

print(f'by join:  {ed - st}')

10万個の文字列要素を結合する速度を比較

 筆者の手元の環境で、このコードを実行した結果を以下に示します。

実行結果 実行結果

 joinメソッドを使った方法が圧倒的に速いことが分かりました。ではメモリの消費量はどうでしょうか? ここではPythonに標準添付のtracemallocモジュールを使って確認してみます。

import tracemalloc

words = ['foo'] * 100000
result = ''

tracemalloc.start()
for word in words:
    result += word

mem_size_now, mem_size_peak = tracemalloc.get_traced_memory()
tracemalloc.stop()

print(f'by += op: now {mem_size_now}, peak {mem_size_peak}')

tracemalloc.start()
result = ''.join(words)

mem_size_now, mem_size_peak = tracemalloc.get_traced_memory()
tracemalloc.stop()

print(f'by join:  now {mem_size_now}, peak {mem_size_peak}')

文字列結合時に確保されたメモリを比較する

 tracemallocモジュールのstart関数はメモリ割り当てのトレースを開始し、stop関数はトレースを終了します。get_traced_memory関数は割り当てられたメモリブロックの現在のサイズと最大のサイズを取得するものです。上のコードでは、これらの関数を使って、+=演算子による文字列結合で割り当てられたメモリのサイズと、joinメソッドによる文字列結合で割り当てられたメモリのサイズを確認しています。

 実行結果は次の通りです。

実行結果 実行結果

 現在のサイズは似たようなものになっています。これは最終的な結果が同じだからでしょう。しかし、最大サイズを見るとその差は歴然としています。+=演算子を使う方法では、文字列の生成と破棄がそれだけ多く行われているということです。

 というわけで、メモリ消費量の面でもjoinメソッドの方が効率的であることがよく分かりました。文字列の結合には可能であればjoinメソッドを使うことをオススメします。


かわさき

 実は上で挙げた以外の方法も試してみました。例えば、リスト内包表記やジェネレータ式やmap関数を使う方法などがそうです(リストの要素が文字列以外だと、str関数で要素を文字列化するためにそうした方法を採ることになるでしょう)。でも、これらの方法でも、最終的にjoinメソッドで結合することに落ち着いちゃうんですよね。

 正解例のjoinメソッドを使うコードに追加の処理が加わるという意味では、実行速度が向上することはないでしょう。さらに、メモリ消費量を考えると、実はjoinメソッドの内部では全ての要素をいったん取得しないと、最終的な文字列のサイズが分かりません。なので、ジェネレータ式やmap関数でメモリ消費量を抑えるというつもりがそうでもない結果になってしまいました。そのために書いたコードはここには登場しません(SSDのゴミとしてどこかにガベージコレクションされました)。

 興味のある方はご自分でも試してみてください。そして、「もっと効率的な方法があるよ!」という方はぜひその方法を教えてくれると幸いです(今回は記事へのリンクはなしです。関連がありそうな記事を思い付きませんでした)。


「Pythonステップアップクイズ」のインデックス

Pythonステップアップクイズ

鬯ッ�ゥ隰ウ�セ�ス�ス�ス�オ�ス�ス�ス�ス�ス�ス�ス�コ鬯ッ�ョ�ス�ヲ�ス�ス�ス�ョ鬮ッ�キ�ス�サ�ス�ス�ス�サ�ス�ス�ス�ス�ス�ス�ス�ソ�ス�ス�ス�ス�ス�ス�ス�ス鬯ッ�ッ�ス�ッ�ス�ス�ス�ィ�ス�ス�ス�ス�ス�ス�ス�セ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�」鬯ッ�ッ�ス�ョ�ス�ス�ス�エ鬮」雋サ�ソ�ス�ス�ス�ス�・�ス�ス�ス�ス�ス�ス�ス�ウ�ス�ス�ス�ス�ス�ス�ス�ィ�ス�ス�ス�ス�ス�ス�ス�ス鬮ッ諛カ�ス�」�ス�ス�ス�、�ス�ス�ス�ス�ス�ス�ス�ク�ス�ス�ス�ス�ス�ス�ス�イ鬯ッ�ゥ陟�瑳�ス�ス�ス�ス�ソ�ス�ス�ス�ス�ス�ス邵コ�、�つ€�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�」鬯ッ�ッ�ス�ョ�ス�ス�ス�エ鬯ッ�ゥ陝カ螢ス譯カ�ス�ス�ス�ュ鬯ョ�ョ�ス�」�ス�ス�ス�ソ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ィ鬯ョ�ッ陋ケ�コ�ス�サ郢ァ謇假スス�ス�ス�ソ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�コ鬯ョ�」陋ケ�ス�ス�ス�ス�オ鬮ォ�エ隰ォ�セ�ス�ス�ス�エ�ス�ス�ス�ス髫カ髮」�ス�」�ス螳茨ス「謇假スス�ュ髮懶ス」�ス�ス�ス�「�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ゥ鬯ッ�ゥ陝キ�「�ス�ス�ス�「鬮ォ�エ髮懶ス」�ス�ス�ス�「�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�シ鬯ッ�ゥ陝キ�「�ス�ス�ス�「鬮ォ�エ闕ウ�サ�ス�ス髫カ謐コ�サ繧托スス�ソ�ス�ス驍オ�コ�ス�、�ス縺、ツ€鬯ッ�ッ�ス�ョ�ス�ス�ス�ヲ�ス�ス�ス�ス�ス�ス�ス�ェ鬯ゥ蛹�スス�カ髣費スィ�ス�ス�ス�ス�ス�ヲ�ス�ス�ス�エ�ス�ス邵コ�、�つ€鬮ッ�キ髣鯉スィ�ス�ス�ス�キ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�サ鬯ッ�ッ�ス�ッ�ス�ス�ス�ェ�ス�ス�ス�ス�ス�ス�ス�ュ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�イ鬯ッ�ゥ隰ウ�セ�ス�ス�ス�オ�ス�ス�ス�ス�ス�ス�ス�コ鬯ョ�ッ�ス�キ�ス�ス�ス�キ�ス�ス�ス�ス�ス�ス�ス�カ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス New

Copyright© Digital Advantage Corp. All Rights Reserved.

スポンサーからのお知らせPR

Deep Insider 鬯ッ�ッ�ス�ッ�ス�ス�ス�ッ�ス�ス�ス�ス�ス�ス�ス�ョ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ォ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ェ鬯ッ�ッ�ス�ョ�ス�ス�ス�ッ鬮ッ蜈キ�ス�ケ�ス�ス�ス�コ�ス�ス�ス�ス�ス�ス�ス�サ鬩幢ス「�ス�ァ髫ー�ス竏橸ソス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ソ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�コ鬯ッ�ッ�ス�ョ�ス�ス�ス�」鬮ッ蜈キ�ス�ケ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�オ鬯ッ�ョ�ス�ォ�ス�ス�ス�エ鬩包スカ隰ォ�セ�ス�ス�ス�オ�ス�ス�ス�ス�ス�ス�ス�コ�ス�ス�ス�ス�ス�ス�ス�キ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ク�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�キ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ケ鬯ッ�ョ�ス�ォ�ス�ス�ス�エ鬯ョ�ョ隲幢スカ�ス�ス�ス�」�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�「�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ウ鬯ッ�ッ�ス�ッ�ス�ス�ス�ゥ鬮ッ譎「�ス�キ�ス�ス�ス�「�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�「�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ァ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ュ鬯ッ�ッ�ス�ッ�ス�ス�ス�ゥ鬮ッ譎「�ス�キ�ス�ス�ス�「�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�「鬯ッ�ョ�ス�ォ�ス�ス�ス�エ鬯ョ�ョ隲幢スカ�ス�ス�ス�」�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�「�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ウ鬯ッ�ッ�ス�ッ�ス�ス�ス�ゥ鬮ッ譎「�ス�キ�ス�ス�ス�「�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�「�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ァ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ー

鬯ッ�ッ�ス�ッ�ス�ス�ス�ョ�ス�ス�ス�ス�ス�ス�ス�ォ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�エ鬯ッ�ョ�ス�ッ髫エ雜」�ス�「�ス�ス�ス�ス�ス�ス�ス�キ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�「�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ャ鬯ッ�ッ�ス�ッ�ス�ス�ス�ョ�ス�ス�ス�ス�ス�ス�ス�ォ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�エ鬯ッ�ッ�ス�ッ�ス�ス�ス�イ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�シ鬮ッ讓奇スサ繧托スス�ス�ス�イ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�・鬯ッ�ッ�ス�ッ�ス�ス�ス�ョ�ス�ス�ス�ス�ス�ス�ス�ォ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�エ鬯ッ�ョ�ス�ッ髫エ雜」�ス�「�ス�ス�ス�ス�ス�ス�ス�カ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�キ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�」�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ッ鬯ッ�ッ�ス�ョ�ス�ス�ス�」鬮ッ�キ�ス�エ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ォ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�」

注目のテーマ

4AI by @IT - AIを作り、動かし、守り、生かす
Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。