Как оптимизировать код с учетом разных размеров ввода? - PullRequest
0 голосов
/ 18 октября 2019

Я хотел бы рассчитать свойства пара наиболее эффективным способом, учитывая скаляр, вектор и матрицу в качестве параметров ввода с двумя аргументами. Что меня беспокоит, так это то, что я должен использовать, если блоки по отношению к размеру входных данных (скаляр, вектор или матрица) делают код довольно длинным. Я простой инженер-механик, довольно новичок в Python, любая помощь в том, как оптимизировать код, высоко ценится. Это код:

from iapws.iapws97 import _Region4
import numpy as np

def h_x(P,x): 
    ''' spec enthalpy in liquid, steam and wet (two-phase flow) regions
    P - pressure in bar
    x - drayness steam fraction [-]
    h - specific heat of wet region returned [kJ/kW]
    '''

    mm = len(np.shape(x))
    if mm == 0:
        h_  = _Region4(P/10,0)['h'] 
        h__ = _Region4(P/10,1)['h'] 
        # return h_ + x * (h__ - h_)
        return h_ + x * (h__ - h_)        
    elif mm == 1:
        return np.array([ _Region4(i/10,0)['h'] + j * ( _Region4(i/10,1)['h'] - _Region4(i/10,0)['h'] ) for i,j in zip(P,x) ])    
    elif mm == 2:
        mmm,nnn = x.shape
        h     = np.ndarray(shape=(mmm,nnn)) #(mm,nn)
        for i in range(mmm):
            for j in range(nnn):
                h_  = _Region4(P[i,j]/10,0)['h']
                h__ = _Region4(P[i,j]/10,1)['h']
                h[i,j]   = h_ + x[i,j] * (h__ - h_)
        return h        
    else:
        print('h_x input must be scalar, vector or 2D matrix!')

# code testing
P = np.array([[.0234,.0193,0.244],[.0244,.0185,0.254]])
x = np.array([[.812,.782,.620],[.912,.882,.820]])
h_x(P,x)

1 Ответ

0 голосов
/ 18 октября 2019

Вы действительно делаете только один расчет, но двумя разными способами. Вы можете извлечь его и применить ко всему, что функция получает в качестве входных данных, используя встроенный map. Если это не помогло, у вас есть одно (не повторяемое) значение, и вы применяете свои вычисления напрямую.

# Define a dummy func to make code work
def _Region4(a, b):
    return {'h': a + 3 * b}

import numpy as np

def calculate(P, x):
    '''
    Spec enthalpy in liquid, steam and wet (two-phase flow) regions
    P - pressure in bar
    x - drayness steam fraction [-]
    h - specific heat of wet region returned [kJ/kW]
    '''
    h_  = _Region4(P/10,0)['h'] 
    h__ = _Region4(P/10,1)['h'] 
    return h_ + x * (h__ - h_) 

def h_x(P,x):
    shape = np.shape(x)
    dimensions = len(shape)
    # Check for wrong input
    if dimensions > 2:
        raise ValueError('h_x input must be scalar, vector or 2D matrix!')
    # Try a general mapping
    try:
        return np.array(list(map(calculate, P.flat, x.flat))).reshape(shape)
    # if it fails then you got a pair of scalar
    except AttributeError:
        return calculate(P, x)

P = np.array([[.023,.23,.05],[.023,.23,.05]])
x = np.array([[.92,.98,.99],[.92,.98,.99]])
print(h_x(P, x))
"""
Out:
    [[2.7623 2.963  2.975 ]
    [2.7623 2.963  2.975 ]]
"""
print(h_x(3, 4))
"""
Out:
    12.3
"""
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...