Python3 Профилирование: файлы не могут быть прочитаны, поскольку неверный путь к профилю python код многопроцессорной обработки - PullRequest
0 голосов
/ 15 апреля 2020

Я бы хотел профилировать код Python3, который использует многопроцессорный код; Я использую следующие библиотеки:

import multiprocessing as mp
from multiprocessing import Pool

и в коде у меня есть различные разделы, подобные этому:

# Original first block for Pz_array
if __name__ == '__main__':
  # Compute and create new Pz_array of PPPxPPP size : only once using a boolean
  if not os.path.isfile("Pz_array"):
    ii = range(PPP)
    pool = mp.Pool(16)
    pool.map(PZ_tab, ii)

Если я просто сделаю для профиля:

python -m profile -o profile.pstats ./file_to_profile.py

Затем я получаю следующую ошибку:

_pickle.PicklingError: Can't pickle <function PZ_tab at 0x101f340c20>: attribute lookup PZ_tab on __main__ failed

Итак, я провел исследования многопроцессорных профилей topi c " python code " и нашел следующую ветку :

https://bugs.python.org/issue9914#msg286491

, который предлагает создать второй файл "run_my_tests.py" и запустить "file_to_profile.py" в "run_my_tests.py" следующим образом :

from file_to_profile import main

if __name__ == "__main__":
    exit(main())

Но теперь при выполнении этого скрипта "run_my_tests.py" (python -m profile -o profile.pstats ./run_test.py) у меня возникают проблемы с путями, которые я использую в файле для профиля (здесь "file_to_profile.py"), например, такого рода сообщения:

    Photoz_tab = np.loadtxt("Pz_array")
  File "/Users/fab/.conda/envs/ipy3/lib/python3.7/site-packages/numpy/lib/npyio.py", line 968, in loadtxt
    fh = np.lib._datasource.open(fname, 'rt', encoding=encoding)
  File "/Users/fab/.conda/envs/ipy3/lib/python3.7/site-packages/numpy/lib/_datasource.py", line 269, in open
    return ds.open(path, mode, encoding=encoding, newline=newline)
  File "/Users/fab/.conda/envs/ipy3/lib/python3.7/site-packages/numpy/lib/_datasource.py", line 623, in open
    raise IOError("%s not found." % path)
OSError: Pz_array not found.

Кажется, что все происходит, как будто текущий путь был изменен во время выполнения сценария оболочки "run_my_tests.py", и я не понимаю, почему.

Функция Pz_array кодируется следующим образом:

# Original first block for Pz_array
if __name__ == '__main__':
  # Compute and create new Pz_array of PPPxPPP size : only once using a boolean
  if not os.path.isfile("Pz_array"):
    ii = range(PPP)
    pool = mp.Pool(16)
    pool.map(PZ_tab, ii)

Photoz_tab = np.loadtxt("Pz_array")
Photoz_tab = sorted(Photoz_tab, key=lambda a_entry: a_entry[0])
Photoz_tab = np.transpose(Photoz_tab)
Photoz_tab = np.delete(Photoz_tab, 0, axis=0) 

Вы можете заметить, что отступ второго блока отсутствует в разделе if __name__ == '__main__': : это может быть проблемой, у меня недостаточно информации для ответа на этот вопрос.

Если кто-то может помочь исправить эту ошибку модификации PATH, чтобы загрузить / создать все файлы относительно текущего каталога выполнение сценария python в профиле, было бы неплохо показать / объяснить это.

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