Я бы хотел профилировать код 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 в профиле, было бы неплохо показать / объяснить это.