Профайлер Yappi вызывает ужасное замедление
Проводя некоторые тесты по оптимизации, я решил сравнить два профилировщика Python: Yappi и cProfile. Я сделал это с помощью следующего скрипта Python:
import yappi
import cProfile
import string
import random
def setup():
strlist = []
for i in range(1000000):
strlist.append(''.join(random.choices(string.ascii_lowercase, k=10)))
return strlist
def execute(strlist):
new_strlist = []
for i in strlist:
new_strlist.append(i.upper())
return new_strlist
def main():
execute(setup())
yappi.set_clock_type("cpu")
yappi.start()
main()
yappi.stop()
yappi.get_func_stats().print_all()
yappi.get_thread_stats().print_all()
cProfile.run("main()")
Я не ожидал, что они будут одинаковыми, поскольку Yappi измерял процессор, а не время стены, но Yappi внезапно начал вызывать ужасное замедление. Чтобы продемонстрировать, вот вывод приведенного выше кода:
Clock type: CPU
Ordered by: totaltime, desc
name ncall tsub ttot tavg
..p_optimization_baseline.py:20 main 1 0.042419 48.78300 48.78300
..p_optimization_baseline.py:7 setup 1 4.765043 43.22398 43.22398
..on3.8/random.py:386 Random.choices 100.. 4.687804 35.68567 0.000036
..python3.8/random.py:399 <listcomp> 100.. 16.40414 29.65616 0.000030
..ptimization_baseline.py:14 execute 1 2.818642 5.516596 5.516596
name id tid ttot scnt
_MainThread 0 140527431976768 **48.78303** 1
17000006 function calls in **4.693 seconds**
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 4.693 4.693 <string>:1(<module>)
1 0.182 0.182 0.342 0.342 loop_optimization_baseline.py:14(execute)
1 0.036 0.036 4.693 4.693 loop_optimization_baseline.py:20(main)
1 0.751 0.751 4.315 4.315 loop_optimization_baseline.py:7(setup)
1000000 0.674 0.000 3.332 0.000 random.py:386(choices)
1000000 1.968 0.000 2.580 0.000 random.py:399(<listcomp>)
1 0.000 0.000 4.693 4.693 {built-in method builtins.exec}
1000000 0.078 0.000 0.078 0.000 {built-in method builtins.len}
2000000 0.128 0.000 0.128 0.000 {method 'append' of 'list' objects}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
1000000 0.159 0.000 0.159 0.000 {method 'join' of 'str' objects}
10000000 0.612 0.000 0.612 0.000 {method 'random' of '_random.Random' objects}
1000000 0.106 0.000 0.106 0.000 {method 'upper' of 'str' objects}
И да, это действительно заняло около 50 секунд в реальной жизни. Когда я вернул Яппи время на стене, вместо этого оно начало занимать около 9 секунд. Что происходит?
Я использую Ubuntu 20.04, Python 3.8 и PyCharm Community Edition 2023.2.2. Yappi был установлен через менеджер пакетов PyCharm и имеет последнюю версию 1.4.0.