Python の文字列は不変であるため、Python で文字列を操作する必要があります。このために、文字列から文字のリストを作成しています。
str = 'abc'
list(str)
問題は、文字列に最大 100 万文字を含めることができ、リストを作成するとコードが遅くなるかどうかわからないことです。
上記のタスクの複雑さはどのくらいですか? 文字列を操作するより良い方法はありますか?
Python の文字列は不変であるため、Python で文字列を操作する必要があります。このために、文字列から文字のリストを作成しています。
str = 'abc'
list(str)
問題は、文字列に最大 100 万文字を含めることができ、リストを作成するとコードが遅くなるかどうかわからないことです。
上記のタスクの複雑さはどのくらいですか? 文字列を操作するより良い方法はありますか?
約 97% の確率で、わずかな効率性を忘れる必要があります。時期尚早の最適化は諸悪の根源です。しかし、その重要な 3% の機会を逃してはなりません。優れたプログラマーは、そのような理由付けによって自己満足に陥ることはありません。彼は、重要なコードを慎重に検討するのが賢明です。ただし、そのコードが特定された後に限ります。プログラムのどの部分が本当に重要であるかをアプリオリに判断するのはしばしば間違いです。なぜなら、測定ツールを使用してきたプログラマーの普遍的な経験は、彼らの直感的な推測が失敗するからです。--Donald Knuth (強調鉱山)
言い換えれば、コードをプロファイリングし、文字列をリストに変換しているために処理が遅い場合を除き、心配する必要はありません。おそらく、他の場所ではるかに大きな利益が得られるでしょう。
私が正しく理解していれば、ファイルから文字列を読み取り、変更してからファイルに書き戻す必要がありますか? このように最もメモリ効率の良い方法は mmap モジュールを使用することであり、リストを作成する必要はありません。モジュールの公式ドキュメントの例を次に示します。
import mmap
# write a simple example file
with open("hello.txt", "wb") as f:
f.write(b"Hello Python!\n")
with open("hello.txt", "r+b") as f:
# memory-map the file, size 0 means whole file
mm = mmap.mmap(f.fileno(), 0)
# read content via standard file methods
print(mm.readline()) # prints b"Hello Python!\n"
# read content via slice notation
print(mm[:5]) # prints b"Hello"
# update content using slice notation;
# note that new content must have same size
mm[6:] = b" world!\n"
# ... and read again using standard file methods
mm.seek(0)
print(mm.readline()) # prints b"Hello world!\n"
# close the map
mm.close()
次のような結果が得られました。
~ $ cat test.py
#!/usr/bin/python2.7
import time
import random
length = len( str(random.random()) )
longString = ""
for x in range(1000000 / length):
longString += str( random.random() )
a = time.time()
li = list(longString)
b = time.time()
print "Time was: " + str(b - a) + " seconds"
print "Length of list" , len(li)
print "length of string " , len(longString)
print "Sample of list: " , li[:100]
~ $ ./test.py
Time was: 0.0284309387207 seconds
Length of list 999863
length of string 999863
Sample of list: ['0', '.', '0', '5', '3', '2', '0', '9', '3', '0' ....actually longer