好奇心から、さまざまな文字列連結/置換方法の速度をテストしていました。この件に関するグーグル検索で、ここにたどり着きました。誰かが決定するのに役立つことを期待して、テスト結果を投稿すると思いました.
import timeit
def percent_():
return "test %s, with number %s" % (1,2)
def format_():
return "test {}, with number {}".format(1,2)
def format2_():
return "test {1}, with number {0}".format(2,1)
def concat_():
return "test " + str(1) + ", with number " + str(2)
def dotimers(func_list):
# runs a single test for all functions in the list
for func in func_list:
tmr = timeit.Timer(func)
res = tmr.timeit()
print "test " + func.func_name + ": " + str(res)
def runtests(func_list, runs=5):
# runs multiple tests for all functions in the list
for i in range(runs):
print "----------- TEST #" + str(i + 1)
dotimers(func_list)
... を実行した後runtests((percent_, format_, format2_, concat_), runs=5)
、これらの小さな文字列で % メソッドが他のメソッドよりも約 2 倍高速であることがわかりました。concat メソッドは常に最も遅い (かろうじて) ものでした。この方法で位置を切り替えると、非常にわずかな違いがありましたが、位置のformat()
切り替えは常に、通常のフォーマット方法よりも少なくとも 0.01 遅くなりました。
テスト結果のサンプル:
test concat_() : 0.62 (0.61 to 0.63)
test format_() : 0.56 (consistently 0.56)
test format2_() : 0.58 (0.57 to 0.59)
test percent_() : 0.34 (0.33 to 0.35)
スクリプトで文字列連結を使用しているため、これらを実行しましたが、コストはいくらか疑問に思っていました。それらをさまざまな順序で実行して、何も干渉していないことを確認したり、最初または最後にパフォーマンスを向上させたりしました。補足として、私はいくつかの長い文字列ジェネレーターをこれらの関数に投入しました。通常の concat は、 andメソッド"%s" + ("a" * 1024)
を使用する場合のほぼ 3 倍 (1.1 対 2.8) 高速でした。それは文字列と、何を達成しようとしているかに依存すると思います。パフォーマンスが本当に重要な場合は、さまざまなことを試してテストすることをお勧めします。速度が問題にならない限り、速度よりも読みやすさを優先する傾向がありますが、それは私だけです。私のコピー/貼り付けが気に入らなかったので、正しく見えるようにすべてに8つのスペースを配置する必要がありました. 普段は4を使っています。format
%