Pythonのアプリケーションをプロファイリングする際に、len()
がセットを使用するときに非常に高価に見えることがわかりました。 lenA()
がlenB()
よりも14倍遅くなるようですが、以下のプロファイラの統計によるとPython 3のlen(set)とset .__ len __()のパフォーマンスの比較
import cProfile
def lenA(s):
for i in range(1000000):
len(s);
def lenB(s):
for i in range(1000000):
s.__len__();
def main():
s = set();
lenA(s);
lenB(s);
if __name__ == "__main__":
cProfile.run("main()","stats");
:以下のコードを参照してください
ncalls tottime percall cumtime percall filename:lineno(function)
1 1.986 1.986 3.830 3.830 .../lentest.py:5(lenA)
1000000 1.845 0.000 1.845 0.000 {built-in method len}
1 0.273 0.273 0.273 0.273 .../lentest.py:9(lenB)
私は何かが足りないのですか?現在、私が代わりにlen()
の__len__()
を使用しますが、コードが汚れに見える:(明らかに
なぜ、 'timeit'ではなく' cProfile'を使用していますか?前者は大規模なプログラムでボトルネックを発見するためのものであり、小規模である程度正確さを犠牲にしています。後者は、細かいスニペットの全体的なパフォーマンスを比較的正確に測定するためのものです。 'timeit'はこのようなマイクロベンチマークの最初の選択でなければなりません。そして、私にとってはそれほど極端な違いがないことを示しています( '' len'呼び出しあたり0.0879μs、 '' len''あたり0.158μs、 '' len''は70%遅い)。 – delnan
ありがとう@delnan、私はPythonでかなり新しいです。 'timeit'を使っても同様の比率が得られます。実際、私のプログラムは上記のコードよりもはるかに大きいですが、 'len()'関数が大きなボトルネックの1つとして現れたことに私は驚きました。だから、私は 'len()'を無視し、自分の関数に焦点を当てるでしょう、そうですか? – Tregoreg