Podczas profilowania mojej aplikacji Pythona, odkryłem, że len()
wydaje się być bardzo drogie, jeden przy użyciu zestawów. Zobacz poniższy kod:Profilowane wydajność len (zestaw) vs. zestawu .__ len __() w Pythonie 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");
Według statystyk Profiler za Poniżej lenA()
wydaje się 14 razy wolniej niż lenB()
:
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)
Am I czegoś brakuje? Obecnie używam __len__()
zamiast len()
, ale kod wygląda brudna :(
Dlaczego używasz 'cProfile' zamiast' timeit'? Ta pierwsza służy do znajdowania wąskich gardeł w dużych programach i poświęca pewną dokładność na małą skalę. Ta ostatnia służy względnie precyzyjnemu pomiarowi ogólnej wydajności małych fragmentów. 'timeit' powinno być pierwszym wyborem dla takich mikro-znaków. A dla mnie to oznacza mniej ekstremalną różnicę (0.0879 mikrosekundy na 'len' rozmowy, 0,158 mikrosekundy na' .__ rozmowy len__' => 'len' jest 70% wolniej). – delnan
Dzięki @delnan, jestem całkiem nowy w Pythonie. Używając 'timeit', uzyskuję również podobny stosunek. Rzeczywiście, mój program jest znacznie większy niż powyższy kod, ale zaskoczyło mnie, że funkcja 'len()' pojawiła się jako jedno z głównych wąskich gardeł. OK, więc zignoruję 'len()' i skupię się na moich własnych funkcjach, prawda? – Tregoreg