'daki len (set) ve set .__ len __() profillerinin performansları Python uygulamasının profilini oluştururken, len()
setlerini kullanırken çok pahalı olduğunu fark ettim. Aşağıdaki kod bakın:Python 3
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");
aşağıda profiler istatistiklerinin göre, lenA()
lenB()
fazla 14 kat daha yavaş gibi görünüyor:
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)
Ben bir şey eksik? Şu anda yerine len()
ait __len__()
kullanabilirsiniz, ancak kod kirli görünüyor :(Açıkçası
Neden "time" yerine "cProfile" kullanıyorsunuz? Birincisi, büyük programlarda darboğazlar bulmak ve bunun için küçük ölçekte bir doğruluktan fedakarlık etmektir. İkincisi, küçük parçacıkların genel performansını nispeten hassas bir şekilde ölçmek içindir. Böyle microbenchmarks için 'timeit' ilk seçim olmalıdır. Ve benim için, daha az uçuk bir fark olduğunu gösterir ('' '' '' 'arama başına 0.0879 ,s,' .__ len__' çağrı => '' len '% 70 daha yavaş olmak üzere 0.158 ss. – delnan
Teşekkürler @delnan, Python'da oldukça yeniyim. 'Timeit' kullanarak da benzer bir oran elde ediyorum. Gerçekten de, programım yukarıdaki koddan çok daha büyüktür, ancak bana 'len() işlevinin büyük darboğazlardan biri olarak göründüğünü şaşırttı. Tamam, bu yüzden ben sadece() 'i görmezden geleceğim ve kendi işlevlerime odaklanacağım, değil mi? – Tregoreg