Я пытаюсь реализовать многопроцессорность для функции Python, которая выполняется в файле Stata .do.

В python я могу просто выполнить простую функцию, которая займет некоторое время:

import multiprocessing as mp 
from timeit import default_timer as timer

def square(x):
    return x ** x

# Non-parallel
start = timer()
[square(x) for x in range(0,1000)]
print("Simple execution took {:.2f} seconds".format(timer()-start))

# Parallel version
pool = mp.Pool(mp.cpu_count())
start = timer()
pool.map(square, [x for x in range(0,1000)])
pool.close()  
print("Multiprocessing execution took {:.2f} seconds".format(timer()-start))

Когда я пытаюсь запустить тот же код, но в файле STATA .do, он прерывается и возвращает ошибку:

enter image description here

Пример файла .do:

python:
import multiprocessing as mp 
from timeit import default_timer as timer

def square(x):
    return x ** x

# Non-parallel
start = timer()
[square(x) for x in range(0,1000)]
print("Simple execution took {:.2f} seconds".format(timer()-start))

# Parallel version
pool = mp.Pool(mp.cpu_count())
start = timer()
pool.map(square, [x for x in range(0,1000)])
pool.close()  
print("Multiprocessing execution took {:.2f} seconds".format(timer()-start))
end

Есть идеи, как я могу найти, что вызывает сообщение об ошибке? Возможно, есть другой способ разрешить многопроцессорность с использованием Python в среде Stata.

0
An economist 14 Апр 2020 в 17:46

1 ответ

Лучший ответ

Могу ответить благодаря службе поддержки Stata .

В Windows многопроцессорность порождает новые процессы с нуля, а не разветвляется. При запуске многопроцессорной обработки во встроенной среде, такой как Stata, необходимо указать путь интерпретатора Python, который будет использоваться при запуске дочернего процесса.

Функция должна быть определена в отдельном файле, здесь my_func.py:


def square(x):
    return x ** x

Файл .do:

python query
di r(execpath)

python:
import multiprocessing as mp
from timeit import default_timer as timer
import platform 
from my_func import square

if platform.platform().find("Windows") >= 0:
        mp.set_executable("`r(execpath)'")

# Non-parallel
start = timer()
[square(x) for x in range(0,1000)]
print("Simple execution took {:.2f} seconds".format(timer()-start))

# Parallel version
if __name__ == '__main__':
        pool = mp.Pool(mp.cpu_count())
        start = timer()
        pool.map(square, [x for x in range(0,1000)])
        pool.close()
        print("Multiprocessing execution took {:.2f} seconds".format(timer()-start))

end
0
An economist 23 Апр 2020 в 11:02