Как извлечь полезную информацию из cProfile с помощью Pandas и Numpy? - PullRequest
1 голос
/ 05 июня 2019

У меня есть некоторый код Python, который генерирует большой набор данных с помощью численного моделирования. Код использует Numpy для большого количества вычислений и Pandas для большого количества данных верхнего уровня. Наборы данных большие, поэтому код работает медленно, и теперь я пытаюсь выяснить, могу ли я использовать cProfile для поиска и исправления некоторых горячих точек.

Проблема в том, что cProfile идентифицирует многие горячие точки как фрагменты кода в Pandas, в Numpy и / или в Python. Вот статистика cProfile, отсортированная по «totaltime» (общему времени внутри самой функции). Обратите внимание, что я скрываю имя проекта и имена файлов, поскольку сам код не принадлежит мне, и у меня нет разрешения на передачу сведений.

foo.sort_stats('tottime').print_stats(50)
Wed Jun  5 13:18:28 2019    c:\localwork\xxxxxx\profile_data

         297514385 function calls (291105230 primitive calls) in 306.898 seconds

   Ordered by: internal time
   List reduced from 4141 to 50 due to restriction <50>

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
   281307   31.918    0.000   34.731    0.000 {pandas._libs.lib.infer_dtype}
      800   31.443    0.039   31.476    0.039 C:\LocalWork\WPy-3710\python-3.7.1.amd64\lib\site-packages\numpy\lib\function_base.py:4703(delete)
   109668   23.837    0.000   23.837    0.000 {method 'clear' of 'dict' objects}
   153481   19.369    0.000   19.369    0.000 {method 'ravel' of 'numpy.ndarray' objects}
  5861614   14.182    0.000   78.492    0.000 C:\LocalWork\WPy-3710\python-3.7.1.amd64\lib\site-packages\pandas\core\indexes\base.py:3090(get_value)
  5861614    8.891    0.000    8.891    0.000 {method 'get_value' of 'pandas._libs.index.IndexEngine' objects}
  5861614    8.376    0.000   99.084    0.000 C:\LocalWork\WPy-3710\python-3.7.1.amd64\lib\site-packages\pandas\core\series.py:764(__getitem__)
 26840695    7.032    0.000   11.009    0.000 {built-in method builtins.isinstance}
 26489324    6.547    0.000   14.410    0.000 {built-in method builtins.getattr}
 11846279    6.177    0.000   19.809    0.000 {pandas._libs.lib.values_from_object}
[...]

Есть ли для меня разумный способ выяснить, какие части моего кода чрезмерно опираются на эти библиотечные функции и встроенные функции? Я ожидаю, что одним из ответов будет «посмотреть совокупную статистику времени, которая, вероятно, покажет, откуда происходят эти дорогостоящие звонки». Совокупные времена дают немного понимания:

foo.sort_stats('cumulative').print_stats(50)
Wed Jun  5 13:18:28 2019    c:\localwork\xxxxxx\profile_data

         297514385 function calls (291105230 primitive calls) in 306.898 seconds

   Ordered by: cumulative time
   List reduced from 4141 to 50 due to restriction <50>

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    643/1    0.007    0.000  307.043  307.043 {built-in method builtins.exec}
        1    0.000    0.000  307.043  307.043 xxxxxx.py:1(<module>)
        1    0.002    0.002  306.014  306.014 xxxxxx.py:264(write_xxx_data)
        1    0.187    0.187  305.991  305.991 xxxxxx.py:256(write_yyyy_data)
        1    0.077    0.077  305.797  305.797 xxxxxx.py:250(make_zzzzzzz)
        1    0.108    0.108  187.845  187.845 xxxxxx.py:224(generate_xyzxyz)
   108223    1.977    0.000  142.816    0.001 C:\LocalWork\WPy-3710\python-3.7.1.amd64\lib\site-packages\pandas\core\indexing.py:298(_setitem_with_indexer)
        1    0.799    0.799  126.733  126.733 xxxxxx.py:63(populate_abcabc_data)
        1    0.030    0.030  117.874  117.874 xxxxxx.py:253(<listcomp>)
     7201    0.077    0.000  116.612    0.016 C:\LocalWork\xxxxxx\yyyyyyyyyyyy.py:234(xxx_yyyyyy)
   108021    0.497    0.000  112.908    0.001 C:\LocalWork\WPy-3710\python-3.7.1.amd64\lib\site-packages\pandas\core\indexing.py:182(__setitem__)
  5861614    8.376    0.000   99.084    0.000 C:\LocalWork\WPy-3710\python-3.7.1.amd64\lib\site-packages\pandas\core\series.py:764(__getitem__)
   110024    0.917    0.000   81.210    0.001 C:\LocalWork\WPy-3710\python-3.7.1.amd64\lib\site-packages\pandas\core\internals.py:3500(apply)
   108021    0.185    0.000   80.685    0.001 C:\LocalWork\WPy-3710\python-3.7.1.amd64\lib\site-packages\pandas\core\internals.py:3692(setitem)
  5861614   14.182    0.000   78.492    0.000 C:\LocalWork\WPy-3710\python-3.7.1.amd64\lib\site-packages\pandas\core\indexes\base.py:3090(get_value)
   108021    1.887    0.000   73.064    0.001 C:\LocalWork\WPy-3710\python-3.7.1.amd64\lib\site-packages\pandas\core\internals.py:819(setitem)
[...]

Есть ли хороший способ определить горячие точки - лучше, чем "просканировать xxxxxx.py и найти все места, где Панды могут выводить данные, и где Numpy может удалять объекты" ...?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...