私はいつも好奇心旺盛でした
Python で印刷する方法が異なるのはなぜですか?
例えば
print "this is ",a," and " ,b
対
print "this is %d and %d" %(a,b)
パフォーマンスの問題はありますか? そしてもの?
私はいつも好奇心旺盛でした
Python で印刷する方法が異なるのはなぜですか?
例えば
print "this is ",a," and " ,b
対
print "this is %d and %d" %(a,b)
パフォーマンスの問題はありますか? そしてもの?
Python で「印刷」する方法は他にもたくさんあります。たとえば、より現代的なstr.format()
方法やsys.stdout.write('foo')
、おそらくその他の方法があります。
print a, b, c
との書式設定の違いに関しては、%
変数の束の間にスペースが必要な場合に、主にデバッグ出力に前者を使用します。正確な書式設定または書式設定の詳細な制御が必要な場合は、を使用します%
(実際、最近は常に を使用していますstr.format
)。
例えば:
print 'DEBUG:', var1, var2
対:
print 'Benchmarks took {0:.3f}s to run'.format(seconds)
また、%
書式str.format
設定はより一般的です。実際には何も出力せず、文字列を返します。文字列は、印刷、ファイルへの書き込み、データベースへの保存、Web 応答としての送信などを行うことができます。
パフォーマンスについては、気にしないでください。3 つすべてがほぼ間違いなく高速であり、時期尚早の最適化が諸悪の根源です。
本当は数字を投稿したくありませんが (間違った考え方を助長する可能性があるため)、timeit
使い方がとても簡単なので、仕方がありませんでした。
C:\>python -m timeit -s "import cStringIO; s = cStringIO.StringIO()"
"print >>s, 'this is', 'a', 'test'"
100000 loops, best of 3: 3.39 usec per loop
c:\>python -m timeit -s "import cStringIO; s = cStringIO.StringIO()"
"print >>s, 'this is %s test' % 'a'"
1000000 loops, best of 3: 1.32 usec per loop
C:\>python -m timeit -s "import cStringIO; s = cStringIO.StringIO()"
"print >>s, 'this is {0} test'.format('a')"
1000000 loops, best of 3: 1.64 usec per loop
print a, b, c
アプローチが大幅に遅い理由はよくわかりません。おそらく実装の詳細です。それでも、心配する必要はありません。ファイルまたは画面に出力するのにかかる時間は、おそらく文字列の書式設定部分よりもはるかに重要です。
2 番目の方法では、出力された引数をより適切にフォーマットできます。たとえば、数値を 16 進数としてフォーマットするように指定したり、浮動小数点数の表示する小数点以下の桁数を指定したりできます。
2つは本質的に同じです。Python は、複雑な文字列でコンマを繰り返し使用することを避けるために、書式設定オプションを提供しています。場合によっては、一方が特定の状況により適している場合もあれば、他方が適している場合もあります。
物事を印刷する方法について話している間、ロギングモジュールに一言申し上げたいと思います。
import logging
# call once per process
logging.basicConfig(level=logging.INFO)
# do this when you would print
logging.info('this is %d and %d', a, b)
印刷と同じくらい簡単ですが、日付による自動ローテーション、カスタムフォーマットなどを使用してファイルにログを記録するように設定するのは非常に簡単です。
時間ではなく空間で、パフォーマンスの問題に対応しています。
これらのステートメントは同等です。
print "this is ",a," and " ,b
sys.stdout.write("this is ");sys.stdout.write(" ");sys.stdout.write(str(a));sys.stdout.write(" ");sys.stdout.write(" and ");sys.stdout.write(str(b));sys.stdout.write("\n");
そしてそれらは等しい:
print "this is %d and %d" %(a,b)
sys.stdout.write("this is %d and %d" %(a,b));sys.stdout.write("\n")
通常、多くの要素を出力する場合、次々とストリームに書き込まれるため、最初のバージョンの方が高速であると見なされます。
2 番目のバージョンでは、文字列の一部を処理してコピーする必要があります"this is %d and %d"
。したがって、そこに多くの要素があり、何度もフォーマットし、文字列が大きい場合、バージョン 1 よりも多くのメモリを使用する可能性があります。
しかし、Python は非常に高レベルであるため、何がより優れているかはわかりません。