Как запустить несколько пар функций python параллельно с разными массивами в качестве входных? - PullRequest
0 голосов
/ 04 августа 2020

В f0.py я создаю список параметров, затем сохраняю их в массиве shape- (1000,M,L,N):

np.save('../data/seed_S.npy',S)

Мне нужно использовать один элемент из указанного выше массива S в еще две функции f1.py и f2.py, я использую:

S = np.load('../data/seed_S.npy')
array_x = S[0]

как в f1.py, так и в f2.py,

, а затем я могу выполнить соответствующие вычисления с S[0].

Точно так же, чтобы запустить две функции f1.py и f2.py во второй раз, я использую второй элемент S:

S = np.load('../data/seed_S.npy')
array_x = S[1]

в обоих f1.py и f2.py,

, а затем я могу сделать соответствующие вычисления с S[1].

и т. д.

Мой вопрос : Я хочу запустить функции f1.py и f2.py N раз (N = 1000), мне всегда приходится менять свои функции f1.py и f2.py. Можно ли реализовать такой же запуск без изменения самих функций? Я хочу запустить пары функций f1.py - f2.py 1000 раз параллельно. Кроме того, я также пытался реализовать идею без функции f0.py, но при каждом запуске f1.py генерирует и сохраняет array_x, а соответствующий f2.py читает и использует этот array_x. Какой метод может быть лучше? Может ли кто-нибудь дать мне предложение? Спасибо!

Я пробовал следующую реализацию.

# f1.py
import numpy as np
from modules import *

class system1:
    def __init__(self,N,M,L):
        # store the parameters in the system1 
        self.M = int(M)
        self.L = int(L) 
        self.N = int(N)
        self.S = init_S(M,L,N)
        self.T = 7 
        # The array 
        self.S_traj = np.zeros((self.T, self.M, self.L+1, self.N))

# Main
if __name__=='__main__':
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument('-M', nargs='?', const=10, type=int, default=10, \
                        help="the number of samples.")
    parser.add_argument('-L', nargs='?', const=5, type=int, default=5, \
                        help="the number of hidden layers.") 
    parser.add_argument('-N', nargs='?', const=8, type=int, default=8, \
                        help="the number of nodes per layer.") 
    args = parser.parse_args()
    M,N,L = args.M, args.N, args.L
    # Preparing parameters for using in f2.py
    parameter_list = np.array([M,L,N])
    # Initilize an instance of system1 
    o = system1(N,M,L)
    #=================================
    #Save the seed for f2.py 
    #=================================
    np.save('../data/para_list.npy', parameter_list)
    np.save('../data/seed_S_M{:d}_L{:d}_N{:d}.npy'.format(M,L,N),o.S)
    # Run some calculation ...
    o.S_traj[0,:,:,:] = o.S # Note that self.S_traj will independent of self.S from now on.
    for index in range(o.T):
        print("Runing f1...")
        print("Done.")
# f2.py
import numpy as np
from modules import *

class system2:
    def __init__(self):
        # f2.py accept the same intial configurations as f1.py. 

        # to obtain the basic parameters: M, L, N
        para_list = np.load('../data/para_list.npy')
        M = para_list[0]
        L = para_list[1]
        N = para_list[2]
        # then store these parameters 
        self.M = M 
        self.L = L 
        self.N = N 
        self.T  = 7
        #arrays 
        self.S_traj = np.zeros((self.T, self.M, self.L+1, self.N))
        self.S = np.load('../data/seed_S_M{:d}_L{:d}_N{:d}.npy'.format(self.M,self.L,self.N))
# Main
if __name__=='__main__':
    import argparse
    # Initilize an instance of system2.
    o = system2()
    # run calculation ...
    o.S_traj[0,:,:,:] = o.S 
    for index in range(o.T):
        print("Running f2...")
        print("Done.")

, а modules.py это:

# modules.py
import numpy as np

# Functions
def init_S(M,L,N):
    S = np.ones((M,L+1,N))
    for i in range(M):
        for j in range(L+1):
            S[i,j,:] = generate_coord(N)
    return S
def generate_coord(N):
    """Randomly set the initial coordinates."""
    v = np.ones(N)
    list = [-1,0]
    for i in range(N):
        v[i] = np.random.choice(list)
    return v

1 Ответ

0 голосов
/ 04 августа 2020

Если вы запускаете их как разные файлы, вам нужно передать им аргументы извне скрипта. Вы можете сделать это просто с помощью sys.argv или более подробно с помощью модуля argparse. Например, если в вашем f1.py есть что-то вроде:

import sys
print(sys.argv[1])

Running python3 f1.py hello, будет напечатано hello. Вы, вероятно, захотите преобразовать ввод в int перед его использованием.

Это должно позволить вам запустить его в al oop из другого скрипта с subprocess.run

...