For 循环会降低性能。有什么替代方案吗?

问题描述 投票:0回答:1

我正在努力提高以下功能的性能

import numpy as np
import time 

r_0 = 0.1

drt_measurement = 9.999999999999991269e+04  3.305791191233514031e-02
9.083278409243831993e+04    6.686534998595229651e-02
8.250594665983537561e+04    9.752796826379055151e-02
7.494244839295065321e+04    1.222236211928119098e-01
6.807231234235593001e+04    1.391699770128363156e-01
6.183197649666256621e+04    1.475585893958198669e-01
5.616370571130075405e+04    1.474552502508378327e-01
5.101505754705831350e+04    1.396688202647400068e-01
4.633839707635276136e+04    1.255930866175393457e-01
4.209045616826028709e+04    1.070282638824464200e-01
3.823193317483828287e+04    8.599030685293859722e-02
3.472712931506624591e+04    6.451708658095048343e-02
3.154361839225600124e+04    4.448062538821159762e-02
2.865194678918063437e+04    2.741401408285973687e-02
2.602536096529677889e+04    1.436044167210013059e-02
2.363955993488576496e+04    5.750104576781006442e-03
2.147247043605739236e+04    1.308807047969248521e-03
1.950404271049667659e+04    0.000000000000000000e+00
1.771606500452241744e+04    0.000000000000000000e+00
1.609199507523391185e+04    0.000000000000000000e+00
1.461680714285303839e+04    0.000000000000000000e+00
1.327685287327581318e+04    0.000000000000000000e+00
1.205973510465334584e+04    0.000000000000000000e+00
1.095419314972977190e+04    5.884342919743409559e-05
9.949998612762719858e+03    7.998619890618585823e-04
9.037860757131376886e+03    2.500965172969732246e-03
8.209340548100375599e+03    5.183567450782240564e-03
7.456772575469013645e+03    8.693985479427597876e-03
6.773194133739925746e+03    1.277455657793208701e-02
6.152280803661701611e+03    1.712274094295426416e-02
5.588287939150567581e+03    2.143744150510841495e-02
5.075997518232417860e+03    2.545264530106331607e-02
4.610669866273584375e+03    2.895921274282790836e-02
4.187999804847402629e+03    3.181618818319655040e-02
3.804076820528789085e+03    3.395336714100914005e-02
3.455348885101409905e+03    3.536703974806452988e-02
3.138589592444641312e+03    3.611085706109572885e-02
2.850868308052988141e+03    3.628366608266923865e-02
2.589523055013517478e+03    3.601596333981682552e-02
2.352135885584347307e+03    3.545635735989378923e-02
2.136510510513593999e+03    3.475913507228068494e-02
1.940651979127065943e+03    3.407371862599613277e-02
1.762748222186123712e+03    3.353649513263438908e-02
1.601153286751617770e+03    3.326521661020837711e-02
1.454372107944078152e+03    3.335591277678888467e-02
1.321046676709491976e+03    3.388204564707710670e-02
1.199943475615865282e+03    3.489547101805602625e-02
1.089942066437459971e+03    3.642866487850397045e-02
9.900247239398013335e+02    3.849762676627922764e-02
8.992670199579990822e+02    4.110488763025969133e-02
8.168292706529540510e+02    4.424212280193264707e-02
7.419487678160369342e+02    4.789199229029628135e-02
6.739327223468492321e+02    5.202898717068607515e-02
6.121518546176058635e+02    5.661923512902567596e-02
5.560345724226672246e+02    6.161939118388957970e-02
5.050616826479952124e+02    6.697489246448506961e-02
4.587615877332899572e+02    7.261797229246705343e-02
4.167059224848219401e+02    7.846589642339019122e-02
3.785055908710423296e+02    8.441989610198158411e-02
3.438071661337024238e+02    9.036522727306788016e-02
3.122896209085568557e+02    9.617268729145930783e-02
2.836613571029640752e+02    1.017017794343546278e-01
2.576575080510160092e+02    1.068055453270566474e-01
2.340374879859364512e+02    1.113369027524976212e-01
2.125827661576324488e+02    1.151561489961011597e-01
1.930948450016954894e+02    1.181391348882323278e-01
1.753934236540186191e+02    1.201854967485512515e-01
1.593147298199906459e+02    1.212262639441004930e-01
1.447100045648438140e+02    1.212301466547610895e-01
1.314441260065423194e+02    1.202078563468665651e-01
1.193943591777153443e+02    1.182139221125656503e-01
1.084492204904446879e+02    1.153456380429484229e-01
9.850744629801818064e+01    1.117390045066268961e-01
8.947705601085354488e+01    1.075617976309274221e-01
8.127450109860885163e+01    1.030041958936550872e-01
7.382389210510589805e+01    9.826768020589901620e-02
6.705629652446552313e+01    9.355316527274525062e-02
6.090910104245309498e+01    8.904947235118862436e-02
5.532543224253661407e+01    8.492327754931115746e-02
5.025363041707156952e+01    8.131154005122069595e-02
4.564677161535060890e+01    7.831712920216649110e-02
4.146223350653990991e+01    7.600795657985991161e-02
3.766130104089801023e+01    7.441943814465099005e-02
3.420880826088217219e+01    7.355964469118533855e-02
3.107281294820336370e+01    7.341613608640509825e-02
2.822430109668880149e+01    7.396329262714643193e-02
2.563691847675508129e+01    7.516899705860667635e-02
2.328672680794541350e+01    7.699977592398718484e-02
2.115198228365702704e+01    7.942392015010443784e-02
1.921293439898502697e+01    8.241257439738865209e-02
1.745164322045190985e+01    8.593920060703628960e-02
1.585181340701575792e+01    8.997808644364771458e-02
1.439864344673082641e+01    9.450262800985891054e-02
1.307868871420905421e+01    9.948396777326518059e-02
1.187973708189962707e+01    1.048902674310989852e-01
1.079069593435122876e+01    1.106865359470413646e-01
9.801489540120787325e+00    1.168346253750716379e-01
8.902965831820848663e+00    1.232928486931701845e-01
8.086811731841407891e+00    1.300147229633645263e-01
7.345476240345480079e+00    1.369465983564550071e-01
6.672100573954371505e+00    1.440243362646556891e-01
6.060454708770327770e+00    1.511696326583486516e-01
5.504879740637368180e+00    1.582869059047162796e-01
5.000235529361520825e+00    1.652617562821384889e-01
4.541853142498352369e+00    1.719617888968693886e-01
4.125491658721156973e+00    1.782400906636870952e-01
3.747298931117743592e+00    1.839409756266481011e-01
3.403775947400438096e+00    1.889069396630453090e-01
3.091744457292589399e+00    1.929852944771389966e-01
2.808317567582508723e+00    1.960328443678645005e-01
2.550873032792241979e+00    1.979173071537675133e-01
2.317028994348411697e+00    1.985149376242555386e-01
2.104621943795689454e+00    1.977048651618161235e-01
1.911686706170022010e+00    1.953618156009037932e-01
1.736438258339263463e+00    1.913499288641969109e-01
1.577255214095804270e+00    1.855210883531741572e-01
1.432664823206368121e+00    1.777213502891315244e-01
1.301329345631354384e+00    1.678085462088224900e-01
1.182033674848871785e+00    1.556828286648617721e-01
1.073674095775390969e+00    1.413298085763469714e-01
9.752480732721008350e-01    1.248730508724671950e-01
8.858449767609145598e-01    1.066292127040442267e-01
8.046376551349524453e-01    8.715528763529736822e-02
7.308747840151903485e-01    6.727361123710773327e-02
6.638739145505944128e-01    4.805690587820010684e-02
6.030151594497604739e-01    3.075315477876142470e-02
5.477354578276738550e-01    1.662898258880479707e-02
4.975233658063408781e-01    6.710983667767722420e-03
4.519143246723060781e-01    1.407583407585111072e-03
4.104863628123966990e-01    0.000000000000000000e+00
3.728561916622883388e-01    0.000000000000000000e+00
3.386756595478945808e-01    0.000000000000000000e+00
3.076285306107807704e-01    0.000000000000000000e+00
2.794275590164317924e-01    0.000000000000000000e+00
2.538118313761663081e-01    0.000000000000000000e+00
2.305443527949769256e-01    0.000000000000000000e+00
2.094098542115712391e-01    0.000000000000000000e+00
1.902128007442865087e-01    4.295370599089006446e-03
1.727755826162377384e-01    2.640854551111869453e-02
1.569368719222600794e-01    7.259131510582693403e-02
1.425501300345730638e-01    1.423914344911824392e-01
1.294822518377939102e-01    2.296111516784170581e-01
1.176123342498509028e-01    3.236305655613548882e-01
1.068305576352440167e-01    4.110383626909880905e-01
9.703716976156935570e-02    4.774860553090806148e-01
8.814156289893920748e-02    5.096622216542943118e-01
8.006143552369422711e-02    4.972726694760475352e-01
7.272203087054407433e-02    4.349122174992410828e-01
6.605544528827768380e-02    3.237240623831713071e-01
5.999999999999999778e-02    1.727623254500962879e-01


def backcalculate_impedance_from_drt_freq(drt_measurement, r_0):
    
    # Extract frequency and DRT from drt_measurement matrix
    drt_frequency = drt_measurement[:,0]
    drt = drt_measurement[:,1]
    
    # Frequency to angular frequency, ω, and scaling factor
    ω_drt = -np.log(2*np.pi*drt_frequency)
    ds = ω_drt[2] - ω_drt[1] # ds is a constant
    
    # Unscaling the DRT
    unscaled_drt = drt*ds
    
    # Initializing Zreal and ZImag vectors
    ZReal = np.empty((len(drt_frequency),1))
    ZImag = np.empty((len(drt_frequency),1))
    
    print("\nBackImpedance For loop")
    tic = time.time()
    # Solve for ZReal and ZImag
    for i in range(len(drt_frequency)):
        K1 = 1 / (1 + np.exp(2 * (-ω_drt[i] + ω_drt))) * unscaled_drt
        K2 = -np.exp(-ω_drt[i] + ω_drt) * K1
        ZReal[i,0] = sum(K1) + r_0
        ZImag[i,0] = sum(K2)
    
    toc = time.time()
    diff = toc - tic
    print(f'Executed in {diff} seconds or {diff*1000} milliseconds')  
    
    # Save Backcalculated Impedance into a (x,3) matrix
    drt_frequency = drt_frequency[:,None]
    backcalculated_impedance = np.hstack((drt_frequency,ZReal,ZImag))
    
    return backcalculated_impedance

目前,每次调用此函数时,我都会花费大约 10 毫秒,其中 for 循环占据了大部分时间,这确实减慢了整体执行速度。有没有比 for 循环更好的替代方案或者向量化其操作的方法?

python numpy performance optimization vectorization
1个回答
0
投票

你可以测试一下吗

def backcalculate_impedance_from_vectorized(drt_measurement, r_0):
    drt_frequency, drt = drt_measurement[:, 0], drt_measurement[:, 1]
    ω_drt = -np.log(2 * np.pi * drt_frequency)
    ds = ω_drt[2] - ω_drt[1]
    unscaled_drt = drt * ds
    ω_drt_expanded = ω_drt[:, np.newaxis]
    K1 = 1 / (1 + np.exp(2 * (ω_drt_expanded - ω_drt))) * unscaled_drt
    ZReal = K1.sum(axis=1) + r_0
    ZImag = (-np.exp(ω_drt_expanded - ω_drt) * K1).sum(axis=1)
    return np.hstack((drt_frequency[:, np.newaxis], ZReal[:, np.newaxis], ZImag[:, np.newaxis]))
© www.soinside.com 2019 - 2024. All rights reserved.