6

文字列連結は、リスト結合よりも Python バイトコードが少ないようです。

これは一例です。

test.py:

a = ''.join(['a', 'b', 'c'])
b = 'a' + 'b' + 'c'

次に、実行しpython -m dis test.pyます。次のpythonバイトコードを取得しました(python 2.7):

  1 0 LOAD_CONST 0 ('')
              3 LOAD_ATTR 0 (結合)
              6 LOAD_CONST 1 ('a')
              9 LOAD_CONST 2 ('b')
             12 LOAD_CONST 3 ('c')
             15 BUILD_LIST 3
             18 CALL_FUNCTION 1
             21 STORE_NAME 1 (ア)

  3 24 LOAD_CONST 6 ('abc')
             27 STORE_NAME 2 (ロ)
             30 LOAD_CONST 4 (なし)
             33 戻り値  

明らかに、文字列連結のバイトコード数は少なくなります。文字列'abc'を直接ロードするだけです。

リスト結合の方がはるかに優れていると常に言う理由を誰か説明できますか?

4

3 に答える 3

14

Python の効率的な文字列連結から

Method 1: 'a' + 'b' + 'c'

Method 6: a = ''.join(['a', 'b', 'c'])

20,000 個の整数が 86kb の長さの文字列に連結されました。

写真

                Concatenations per second     Process size (kB)
  Method 1               3770                    2424
  Method 6               119,800                 3000

結論 : はい、通常の連結 ( ) よりstr.join()大幅に高速str1+str2です。

于 2013-04-22T12:46:26.637 に答える
4

信じないで!必ず証拠を取ってください!

ソース: Python のソース コードを 1 時間見つめて、複雑さを計算しました!

私の発見。

2弦用。(n は両方の文字列の長さと仮定します)

Concat (+) - O(n)
Join - O(n+k) effectively O(n)
Format - O(2n+k) effectively O(n)

2 弦以上の場合。(n はすべての文字列の長さと仮定します)

Concat (+) - O(n^2)
Join - O(n+k) effectively O(n)
Format - O(2n+k) effectively O(n)

結果:

2 つの文字列がある場合、技術的に連結 (+) の方が優れていますが、効果的には結合とフォーマットとまったく同じです。

文字列が 2 つ以上ある場合、concat はひどくなり、join と format は事実上同じになりますが、技術的には join の方が少し優れています。

まとめ:

効率を気にしない場合は、上記のいずれかを使用してください。(あなたが質問したので、私はあなたが気にかけていると思います)

したがって -

文字列が 2 つある場合は concat を使用します (ループでない場合)。文字列が 3 つ以上ある場合 (すべての文字列) (またはループ内) は join を使用します。

お役に立てれば!

于 2014-02-23T05:31:51.740 に答える
3

なぜなら

''.join(my_list)

よりもはるかに優れています

my_list[0] + my_list[1]

そしてより良い

my_list[0] + my_list[1] + my_list[2]

そしてより良い

my_list[0] + my_list[1] + my_list[2] + my_list[3]

さらに良いことに…</p>

要するに:

print 'better than'
print ' + '.join('my_list[{}]'.format(i) for i in xrange(x))

任意のx

于 2013-04-22T12:41:53.360 に答える