Daugiau

Naudojant „Python“ įrašams skaičiuoti ir „ArcGIS Desktop“ skirtumui parodyti?


Bandau rasti „ArcGIS 10.1“ python scenarijaus pavyzdį, kuris gaus „ArcSDE“ funkcijų klasės (FC) skaičių ir gaus gaunamų failų geoduomenų bazės atnaujinimo FC skaičių ir tada įrašys skirtumą į žurnalo failą . Kas mėnesį gauname iš pardavėjo atnaujinimus. Pavyzdžiui, šuliniai FC ir norite, kad būtų galima palyginti įrašų skaičių ir log diff (a-b = C). Šiuo metu turiu scenarijų, kuris įrašys pradžios laiką, gaus skaičiavimą, sutrumpins, pridės, atstatys indeksą.


Čia pateikiamas vieno linijos rinkinys, norint gauti įrašų skaičių konkrečiame FC ar lentelėje:

count = suma (1 eilutei arcpy.da.SearchCursor (r'C:  PATH  TO  FC ', [' OID @ ']))

Galite išbandyti „GetCount_management“.

importuoti „arcpy“ iš „arcpy“ importuoti env env.workspace = "C: /Path/to.gdb" count = int (arcpy.GetCount_management ("FC"). getOutput (0))

Parašiau scenarijų, kuris naudoja funkcijų palyginimo įrankį dviejose duomenų bazėse kaip priemonę jiems palyginti. Tai ne tik parodys elementų klasių skaičių, jei jos pasikeitė, bet ir grąžins visus priskyrimo, geometrijos, erdvinės nuorodos ar schemos pokyčius. Aš taip pat esu naujas, todėl, jei kas nors turi patobulinimų, praneškite man.

importuoti arcpy iš os importuoti mkdir iš shutil importuoti rmtree def palyginti (): old = arcpy.GetParameterAsText (0) old_path = old + '' arcpy.env.workspace = old old_fds = arcpy.ListDatasets () new = arcpy.GetParameterAsText (1) arcpy.env.workspace = new new_path = new + '' new_fds = arcpy.ListDatasets () for old_fd, new_fd zip (old_fds, new_fds): old_fcs = arcpy.ListFeatureClasses (feature_dataset = old_fd) new_fcs = .ListFeatureClasses (feature_dataset = new_fd) base = old_path + old_fd + '' test = new_path + new_fd + '' for old_fc, new_fc zip (old_fcs, new_fcs): base_features = base + old_fc test_features = new = 'OBJECTID' Compare_type = 'ALL' xy_tolerance = '0.001 FEET' m_tolerance = 0 z_tolerance = 0 attribute_tolerance = "omit_field =" contin_compare = 'CONTINUE_COMPARE' Compare_file = scratch_dir + '' + new_fc +'txt '. .FeatureCompare_management (bazinės savybės, testo funkcijos, rūšiavimo_ laukas, palyginimo tipas, ", xy_tolerancija, m_tolerancija, z_tolerancija, atributo_tolerancija, praleisti lauką, tęsti_palyginti, palyginti_failą) in_rows = scratch_dir + '' + new_fc + '.txt' out_path = scratch_dir out_name = new_fc + '.dbf' dbfs = arcpy.TableToTable_conversion_wp dbfs: field = 'FEATURECL' newfield = arcpy.AddField_management (dbf, field, 'TEXT', ",", 100) cursor = arcpy.UpdateCursor (newfield) eilutei žymeklyje: row.setValue (field, new_fc) žymeklis .updateRow (row) def listmerge (): arcpy.env.workspace = scratch_dir listTable = arcpy.ListTables ('*. dbf', 'dBASE') arcpy.Merge_management (listTable, final_dir + '' + "output.dbf ") rmtree (scratch_dir) output_dir = arcpy.GetParameterAsText (2) scratch_dir = output_dir + '' +" scratch "final_dir = output_dir + '' +" output "mkdir (scratch_dir) mkdir (final_dir) palyginti () listmerge ()

Geografinė transformacija: WGS_1984_ (ITRF00) _To_NAD_1983 vs NAD_1983_To_WGS_1984_1 (ir kt.)

Neseniai dirbu kai kuriuose duomenų rinkiniuose, susijusiuose su eismo skaičiavimo stotimis. Buvo du formos failai: viena yra vietos, kuriose dirbsime rudenį, o kita - visi stočių įrašai duomenų bazėje. Abu jie buvo WGS_1984 GCS, bet nebuvo numatyti projektuojamoje koordinačių sistemoje (PCS). Taigi aš juos suprojektavau į NAD_1983_StatePlane_OHIO_South. Tačiau po projekcijos dviejų sluoksnių taškai nebuvo toje pačioje vietoje (tik nedidelis skirtumas, tačiau kadangi jie turi tą pačią platumą ir ilgumą, tai neturėtų atsitikti). Taigi aš dar kartą paleidžiau projekto įrankius ir radau, kad vienas iš jų pagal nutylėjimą naudojo transformaciją WGS_1984_ (ITRF00) _To_NAD_1983, o kitas - NAD_1983_To_WGS_1984_1. Tas, kuriame įvyko WGS_1984_ (ITRF00) _To_NAD_1983 transformacija, taškų vietos nepakeitė. Tačiau kita transformacija - NAD_1983_To_WGS_1984_1 - šiek tiek pajudintų taškus. Taip pat radau, kad yra ir keletas kitų transformacijų, tokių kaip NAD_1983_To_WGS_1984_5, NAD_1983_To_WGS_1984_4. Man tiesiog įdomu, kokie yra šių transformacijų skirtumai? Kodėl projekto įrankis vienam pasirinko WGS_1984_ (ITRF00) _To_NAD_1983, o kitam shapefile naudojo kitą. Aš patikrinau dviejų formų failų erdvines nuorodas ir maniau, kad jie yra identiški.


Šis skirtumas pateikia kontekstą supančias eilutes, kad būtų lengviau suprasti, koks failas skiriasi. Čia galite pamatyti „katę“ du kartus, nes ji buvo pašalinta iš apačios „šuo“ ir pridėta virš jos.

Norėdami pašalinti kontekstą, galite naudoti n = 0.

Bet dabar čia pilna „@@“ eilučių, nurodančių pasikeitusios bylos vietą. Pašalinkime papildomas eilutes, kad būtų lengviau skaityti.

Ką tu nori, kad tai darytų? Jei ignoruosite visas pašalintas linijas, nematysite, kad „skalikas“ buvo pašalintas. Jei džiaugiatės tik parodydami failo papildymus, galite tai padaryti:

Tikriausiai jau galite pasakyti, kad yra du būdai, kaip „atspausdinti dviejų failų skirtumus“, todėl turėsite būti labai konkretūs, jei norite daugiau pagalbos.


Bendro darbinio vaizdo išlaikymas

Sužinokite, kaip Chapel Hill miestas, NC, naudojo „ArcGIS“ informacijos suvestines, kad sukurtumėte informacinių prietaisų skydelių rinkinį, kuris supaprastintų operacijas Avarinių operacijų centre.

Bendro darbinio vaizdo išlaikymas Nusikalstamumo rizikos mažinimas Padidinti situacijos supratimą Kroatijos geležinkelių saugos gerinimas Supaprastinant vyriausybės operacijas Spartesnis atkūrimas po nelaimių


Skaičiavimai

Apibendrinta statistika apskaičiuojama kiekvienam įvesties sluoksnio laukui. Laukai turės skirtingą statistikos išvestį, atsižvelgiant į lauko tipą. Šiame dirvožemio gylio pavyzdyje aprašoma, kaip apskaičiuojama kiekvieno lauko tipo statistika:

Šie įvesties funkcijų pavyzdžiai bus apibendrinti ir pateikti kaip apskaičiuota statistika.


Įrankio organizavimas

Geoprocesoriaus įrankiai organizuojami dviem skirtingais būdais. Visus įrankius galima naudoti kaip „ArcPy“ funkcijas, tačiau jie taip pat prieinami moduliuose, atitinkančiuose įrankių rinkinio pseudonimo pavadinimą. Nors dauguma pagalbos pavyzdžių rodo įrankius, išdėstytus kaip „ArcPy“ prieinamas funkcijas, abu metodai yra vienodai tinkami. Kurį požiūrį naudosite, tai nulems asmeninių pageidavimų ir kodavimo įpročių klausimą. Šiame pavyzdyje „GetCount“ įrankis rodomas naudojant abu metodus.

Kai naudojate įrankius moduliuose, kartais norėtumėte atkreipti dėmesį į tai, kaip modulis atpažįstamas, kad jūsų scenarijus būtų lengviau skaitomas. Tokiu atveju galite naudoti formą iš - import - kaip.

Erdvinių analizatorių įrankiai yra tvarkomi skirtingai, kad atitiktų „Map Algebra“, ir yra prieinami tik modulyje arcpy.sa, o ne kaip „ArcPy“ funkcijos.


Išvada

Sveikiname, jūs baigėte šią pamoką!

Šioje pamokoje aprašėte daug informacijos apie klientų segmentavimą. Jūs sužinojote, kas yra klientų segmentavimas, klientų segmentavimo poreikis, segmentavimo tipai, RFM analizė, RFM diegimas nuo nulio pitone. Be to, jūs apėmėte keletą pagrindinių pandų sąvokų, tokių kaip dublikatų tvarkymas, groupby ir qcut () šiukšliadėžėms, pagrįstoms mėginių kvantiliais.

Tikimės, kad dabar galite naudoti temų modeliavimą, kad galėtumėte analizuoti savo duomenų rinkinius. Dėkojame, kad perskaitėte šią pamoką!

Jei norite sužinoti daugiau apie „Python“, eikite į „DataCmp“ nemokamą „Intro to Python for Data Science“ kursą.


Diskusija

Jei turite išorinę programą, kuri skaičiuoja failo eilutes, pvz., „Wc -l“ į „Unix“ panašias platformas, žinoma, galite pasirinkti ją naudoti (pvz., Per os.popen ()). Tačiau paprastai paprasčiau, greičiau ir patogiau atlikti eilučių skaičiavimą jūsų programoje. Galite pasikliauti beveik visais tinkamo dydžio tekstiniais failais, kad būtų įmanoma iškart perskaityti visą failą į atmintį. Visiems tokiems įprastiems failams eilutės skaičiaus rezultatas pateikia paprasčiausią eilučių skaičių.

Jei failas yra didesnis nei laisvos atminties (tarkime, keli šimtai megabaitų įprastame kompiuteryje šiandien), paprasčiausias sprendimas gali tapti lėtas, nes operacinė sistema stengiasi failo turinį sutalpinti į virtualiąją atmintį. Tai gali net nepavykti, kai išeikvojama apsikeitimo vieta ir virtuali atmintis nebegali padėti. Įprastame asmeniniame kompiuteryje, kuriame yra 256 MB RAM ir praktiškai neribota vietos diske, vis tiek turėtumėte tikėtis rimtų problemų, kai bandysite perskaityti, tarkime, 1 arba 2 GB atminties failus, priklausomai nuo jūsų operacinės sistemos (kai kurios operacinės sistemos yra daug trapiau nei kiti tvarkydami virtualiosios atminties problemas tokiomis per daug apkrautomis sąlygomis). Šiuo atveju failų objektų „xreadlines“ metodas, įvestas „Python 2.1“, paprastai yra geras būdas apdoroti tekstinius failus eilutėmis. „Python 2.2“ galite padaryti dar geriau tiek aiškumo, tiek greičio atžvilgiu, sukurdami tiesiai ties failo objektu:

Tačiau „xreadlines“ negrąžina sekos ir ciklo tiesiai į failo objektą, todėl šiais atvejais galite ne tik naudoti „len“, kad gautumėte eilučių skaičių. Atvirkščiai, jūs turite kilpą ir skaičiuoti eilutes po eilutes, kaip parodyta sprendime.

Trečiojo požiūrio pagrindinė idėja yra skaičiuoti eilutės terminatoriaus simbolius skaitant failą baitais, pagrįsto dydžio gabalėliais. Tai, ko gero, yra mažiausiai intuityvus ir nėra tobulas tarp platformų, tačiau galite tikėtis, kad jis greičiausias (pavyzdžiui, pagal analogiją su 8.2 receptu Perlo kulinarija ).

Tačiau atminkite, kad daugeliu atvejų spektaklis iš tikrųjų neturi tiek daug reikšmės. Kai tai turi reikšmės, laiko nuskendimas gali būti ne toks, kokį jums sako intuicija, todėl šiuo klausimu niekada neturėtumėte pasitikėti savo intuicija - verčiau visada pamatuokite ir išmatuokite. Pvz., Paėmiau tipišką vidutinio dydžio „Unix“ syslog failą, šiek tiek daugiau nei 18 MB teksto 230 000 eilučių:

ir aš sukūriau šį etalono sistemos scenarijų „bench.py“:

Pirmiausia atsispausdinu eilučių skaičių, gautą taikant visus metodus, taip užtikrindamas, kad nebūtų jokių anomalijų ar klaidų (skaičiavimo užduotyse yra žinoma, kad yra klaidų po vieną). Tada kiekvieną alternatyvą paleidžiu 10 kartų, kontroliuodama laiko funkciją „timeo“, ir žiūriu į rezultatus. Jie yra čia:

Kaip matote, našumo skirtumai vargu ar turi reikšmės: maždaug 10% skirtumas vienoje pagalbinėje užduotyje yra tai, ko jūsų vartotojai niekada net nepastebės. Tačiau greičiausias būdas (mano ypatingomis aplinkybėmis - pigus, bet visai neseniai įsigytas kompiuteris, kuriame veikia populiarus „Linux“ paskirstymas, taip pat šis konkretus etalonas) yra kukli „loop-on-line-line“ technika, o lėčiausia - ambicinga technika. kad suskaičiuoja linijos terminatorius gabalais. Praktiškai, nebent turėčiau jaudintis dėl daugybės šimtų megabaitų failų, visada naudojau paprasčiausią metodą (t. Y. Pirmąjį, pateiktą šiame recepte).


Naudojant „Python“ įrašams skaičiuoti ir „ArcGIS Desktop“ skirtumui parodyti? - Geografinės informacinės sistemos

Gali būti daug atvejų, kai norite ieškoti sistemoje. Tarkime, kad rašydami mp3 grotuvą galite turėti visus & # 8216.mp3 ir # 8217 failus. Na, kaip tai padaryti paprastu būdu.
Šis kodas ieško visuose aplankuose, esančiuose paleistame faile. Jei norite kitų failų rūšių, tiesiog pakeiskite plėtinį.

os nėra išorinis pitonas. Taigi manau, kad tai yra paprasčiausias ir geriausias būdas tai padaryti.

Prie šio straipsnio prisidėjo soumith kumar. Jei jums patinka „GeeksforGeeks“ ir norėtumėte prisidėti, taip pat galite parašyti straipsnį naudodami „contrib.geeksforgeeks.org“ arba išsiųsti savo straipsnį adresu [email protected] Peržiūrėkite savo straipsnį „GeeksforGeeks“ pagrindiniame puslapyje ir padėkite kitiems „Geeks“.

Parašykite komentarus, jei radote ką nors neteisingo arba norite pasidalinti daugiau informacijos aukščiau aptarta tema.

Dėmesio geek! Stiprinkite savo pagrindus „Python“ programavimo fondas Kursas ir mokykis pagrindų.

Pirmiausia, pasirengimas interviu. Patobulinkite savo duomenų struktūrų koncepcijas naudodami „Python DS“ Žinoma. Norėdami pradėti nuo mašininio mokymosi kelionės, prisijunkite prie Mašinų mokymasis ir # 8211 pagrindinio lygio kursai


Naudojant „Python“ įrašams skaičiuoti ir „ArcGIS Desktop“ skirtumui parodyti? - Geografinės informacinės sistemos

line_profiler ir kernprof

PASTABA: Tai oficiali „line_profiler“ saugykla. Naujausia „pypi“ linijos profilio versija nurodo šį atpirkimą. Originalus @rkern „line_profiler“ paketas šiuo metu neprižiūrimas. Šiuo šakute siekiama paprasčiausiai išlaikyti pradinį kodą, kad jis ir toliau veiktų naujose „Python“ versijose.

„line_profiler“ yra modulis, skirtas atlikti funkcijų profiliavimą eilutėmis. „kernprof“ yra patogus scenarijus, skirtas paleisti „line_profiler“ arba „Python“ standartinės bibliotekos cProfile arba profilio modulius, atsižvelgiant į tai, kas yra.

Jie yra prieinami pagal BSD licenciją.

„Line_profiler“ leidimus galima įdiegti naudojant „pip“:

Šaltinio leidimus ir bet kokius dvejetainius failus galite atsisiųsti iš „PyPI“ nuorodos.

Norėdami sužinoti kūrimo šaltinius, galite naudoti „Git“:

Taip pat galite atsisiųsti bet kurio momentinio vaizdo šaltinio paketus iš to URL.

Šaltinių leidimams reikalingas C kompiliatorius, kad būtų galima sukurti line_profiler. Be to, „git“ kasoms taip pat reikės „Cython“ & gt = 0,10. Šaltinio leidimuose PyPI turėtų būti iš anksto sugeneruoti C šaltiniai, todėl tokiu atveju nereikėtų reikalauti „Cython“.

kernprof yra grynas vieno failo „Python“ scenarijus ir jam nereikia kompiliatoriaus. Jei norite jį naudoti norėdami paleisti „cProfile“, o ne linijinį profiliavimą, galite rankiniu būdu nukopijuoti jį į savo PATH katalogą ir nebandyti kurti jokių „C“ plėtinių.

Nuo 2021-04-25 „pypi“ yra prieinami tik „Linux“ dvejetainiai failai. Jei esate ant langų ir negalite kurti iš šaltinio, apsvarstykite galimybę naudoti neoficialius Christopho Gohlke'o linijinio profilio rinkiklius „Win32“ ratus.

Dabartiniai profiliavimo įrankiai, palaikomi „Python 2.7“ ir vėlesnėse versijose, kviečia tik laiką. Tai yra geras pirmas žingsnis nustatant karštuosius taškus savo programoje ir dažnai viskas, ko reikia padaryti norint optimizuoti programą. Tačiau kartais viešosios interneto prieigos taško priežastis iš tikrųjų yra viena eilutė funkcijoje, ir ta eilutė gali būti akivaizdi ne tik skaitant šaltinio kodą. Šie atvejai ypač dažni atliekant mokslinius skaičiavimus. Funkcijos paprastai būna didesnės (kartais dėl teisėtų algoritmų sudėtingumo, kartais dėl to, kad programuotojas vis dar bando rašyti FORTRAN kodą), o vienas sakinys be funkcijų iškvietimų gali sukelti daug skaičiavimų, kai naudojamos tokios bibliotekos kaip „numpy“. „cProfile“ tik kartoja aiškius funkcijos iškvietimus, o ne specialius metodus, iškviečiamus dėl sintaksės. Taigi, palyginti lėta skaičiavimo operacija tokiuose dideliuose masyvuose,

yra viešosios interneto prieigos taškas, kurio niekada nepažeidžia „cProfile“, nes tame sakinyje nėra aiškaus funkcijos iškvietimo.

„LineProfiler“ gali būti suteiktos funkcijos profiliui, ir tai nustatys kiekvienos eilutės vykdymą tose funkcijose. Įprastoje darbo eigoje rūpi tik kelių funkcijų eilučių laikas, nes bėgioti per laiko rezultatus kiekvienoje kodo eilutėje būtų didžiulė. Tačiau „LineProfiler“ reikia aiškiai pasakyti, kokias funkcijas reikia profilizuoti. Lengviausias būdas pradėti yra naudoti kernprof scenarijų.

kernprof sukurs „LineProfiler“ egzempliorių ir įterps jį į __builtins__ vardų sritį su vardo profiliu. Jis buvo parašytas naudoti kaip dekoratorius, todėl savo scenarijuje jūs dekoruojate funkcijas, kurias norite apibūdinti @profile.

Numatytasis „kernprof“ elgesys yra rezultatų įdėjimas į dvejetainį failą script_to_profile.py.lprof. Galite nurodyti kernprof nedelsiant peržiūrėti suformatuotus rezultatus terminale naudodami parinktį [-v / - view]. Kitu atveju rezultatus galite peržiūrėti vėliau taip:

Pvz., Čia pateikiami vienos funkcijos profiliavimo iš dekoruotos pystone.py etalono versijos rezultatai (pirmosios dvi eilutės išvedamos iš pystone.py, o ne kernprof):

Funkcijos šaltinio kodas spausdinamas su kiekvienos eilutės laiko informacija. Yra šeši informacijos stulpeliai.

  • Eilutė #: failo eilutės numeris.
  • Pataikymai: eilutės vykdymo kartų skaičius.
  • Laikas: bendra laiko suma, praleista vykdant eilutę laikmačio vienetais. Antraštės informacijoje prieš lenteles pamatysite eilutę „Laikmačio vienetas:“, nurodantį perskaičiavimo koeficientą sekundėms. Skirtingose ​​sistemose gali būti skirtingai.
  • Per hitą: vidutinė laiko trukmė, praleista vykdant eilutę vieną kartą laikmačio vienetuose.
  • Laikas: Laiko procentas, praleistas toje eilutėje, palyginti su visa užfiksuoto laiko, praleisto funkcija.
  • Eilutės turinys: tikrasis šaltinio kodas. Atminkite, kad tai visada skaitoma iš disko, kai peržiūrimi suformatuoti rezultatai, ne kai kodas buvo įvykdytas. Jei tuo tarpu redagavote failą, eilutės nesutaps ir formatavimas gali net nerasti rodomos funkcijos.

Jei naudojate „IPython“, yra įdiegta „% lprun“ magijos komanda, leidžianti nurodyti profilio funkcijas ir vykdymą. Jis taip pat pridės savo „LineProfiler“ egzempliorių į __builtins__, bet paprastai jo taip nenaudosite.

„IPython 0.11+“ galite įdiegti redaguodami „IPython“ konfigūracijos failą

/.ipython/profile_default/ipython_config.py pridėti elementą „line_profiler“ į plėtinių sąrašą:

Norėdami gauti „% lprun“ naudojimo pagalbos, naudokite standartinį „IPython“ pagalbos mechanizmą:

Manoma, kad šie du metodai yra dažniausiai vartotojo „LineProfiler“ naudojimo būdai ir paprastai bus paprasčiausi. Tačiau jei kuriate kitus įrankius naudodami „LineProfiler“, turėsite naudoti API. Yra du būdai, kaip „LineProfiler“ pranešti apie funkcijas į profilį: galite perduoti jas kaip argumentus konstruktoriui arba naudoti metodą „add_function (f“) po momentinio pakeitimo.

„LineProfiler“ turi tuos pačius run (), runctx () ir runcall () metodus kaip ir cProfile. Profilis, taip pat įgalinimas () ir išjungimas (). Vis dėlto reikėtų pažymėti, kad įgalinimas () ir išjungimas () nėra visiškai saugus, kai jie yra įdėti. Lizdų įdėjimas yra įprastas, kai „LineProfiler“ naudojamas kaip dekoratorius. Norėdami palaikyti lizdą, naudokite enable_by_count () ir disable_by_count (). Šios funkcijos padidins ir sumažins skaitiklį ir iš tikrųjų įgalins arba išjungs profilį tik tada, kai skaičius pereis iš arba į 0.

Po profiliavimo metodas dump_stats (failo pavadinimas) išrinks rezultatus į pateiktą failą. „print_stats“ ([srautas]) atspausdins suformatuotus rezultatus į sys.stdout arba bet kurį jūsų nurodytą srautą. „get_stats“) grąžins „LineStats“ objektą, kuriame yra tik du atributai: žodynas, kuriame yra rezultatai, ir laikmatis.

kernprof taip pat veikia su „cProfile“, jo trečiųjų šalių įsikūnijimu „lsprof“ arba „pure-Python“ profilio moduliu, atsižvelgiant į tai, kas yra prieinama. Jis turi keletą pagrindinių savybių:

  • Profiliavimo problemų apibendrinimas. Norėdami pradėti profiliavimą ir išsaugoti rezultatus, neprivalote modifikuoti scenarijaus. Žinoma, jei nenorite naudoti pažangių __builtins__ funkcijų.
  • Tvirtas scenarijaus vykdymas. Daugeliui scenarijų reikia nustatyti tokius dalykus kaip __name__, __file__ ir sys.path, palyginti su juo. Naivus požiūris į kapsuliavimą būtų tiesiog naudojamas execfile (), tačiau daugybė scenarijų, kurie remiasi ta informacija, nepavyks. Prieš vykdydamas scenarijų, kernprof teisingai nustatys tuos kintamuosius.
  • Lengva vykdoma vieta. Jei formuojate programą, įdiegtą PATH, galite tiesiog nurodyti vykdomojo failo pavadinimą. Jei kernprof neranda nurodyto scenarijaus dabartiniame kataloge, jis ieškos jūsų PATH.
  • Įdėkite profilį į __builtins__. Kartais tiesiog norite apžiūrėti nedidelę kodo dalį. Naudojant argumentą [-b / - builtin], „Profiler“ bus supaprastintas ir įterptas į jūsų __builtins__ pavadinimu „profilis“. Kaip ir „LineProfiler“, jis gali būti naudojamas kaip dekoratorius arba įjungtas / išjungtas su enable_by_count () ir disable_by_count (), arba net kaip konteksto tvarkyklė su sakiniu „with profile:“.
  • Išankstinio profiliavimo nustatymas. Naudodami parinktį [-s / - setup], galite pateikti scenarijų, kuris bus vykdomas be profiliavimo prieš vykdant pagrindinį scenarijų. Tai paprastai naudinga tais atvejais, kai didelių bibliotekų, pvz., „WxPython“ ar „VTK“, importavimas trukdo jūsų rezultatams. Jei galite modifikuoti šaltinio kodą, __builtins__ metodas gali būti lengvesnis.

Pagal numatytuosius nustatymus profilio script_to_profile.py rezultatai bus įrašyti į script_to_profile.py.prof. Tai bus tipinis sutvarkytas failas, kurį galima nuskaityti naudojant pstats.Stats (). Jie gali būti interaktyviai žiūrimi naudojant komandą:

Tokius failus taip pat galima peržiūrėti naudojant grafinius įrankius, tokius kaip „SnakeViz“, ir konvertuoti per pyprof2calltree, kad jie veiktų „kcachegrind“ ir suderinamose programose.

Nespėjau sugalvoti prasmingo vardo, todėl jį pavadinau savo vardu.

Kodėl gi nenaudojant „hotshot“ vietoje line_profile?

„hotshot“ taip pat gali atlikti laiko eilutes. Tačiau jis nebenaudojamas ir gali išnykti iš standartinės bibliotekos. Be to, norint apdoroti rezultatus, gali prireikti daug laiko, kol noriu greito darbo eigos. „hotshot“ moka šį apdorojimo laiką, kad būtų kuo mažiau įsiterpęs į profiliuojamą kodą. Pavyzdžiui, kodas, kuris atlieka tinklo operacijas, netgi gali eiti skirtingais kodų keliais, jei profiliuojant per daug sulėtinamas vykdymas. Mano naudojimosi atvejais ir, manau, daugelio kitų žmonių, jų rūpesčiai jų linijiniam profiliavimui neturi didelės įtakos.

Kodėl neleisite naudoti „hotshot“ iš kernprof.py?

Aš pats nenaudoju „hotshot“. Vis dėlto sutiksiu su įnašais.

Eilutės po eilutės laikas nesumuojamas, kai viena profiliuota funkcija paskambina kitai. Kas čia?

Tarkime, kad turite funkciją F (), skambinančią funkciją G (), ir jūs naudojate „LineProfiler“ abiejuose. Bendras G () nurodytas laikas yra mažesnis nei laikas, nurodytas F () linijoje, kuri skambina G (). Priežastis ta, kad aš protingai (ir galbūt per protingai) fiksuoju laiką. Iš esmės stengiuosi užkirsti kelią „LineProfiler“, praleisto kiekvienoje eilutėje, tvarkymui. Kiekvieną kartą, kai „Python“ atsekimo priemonė išleidžia eilutės įvykį (kuris įvyksta prieš pat eilutei faktiškai vykdant), „LineProfiler“ ras du laiko žymes, vieną pradžioje, kol ji nieko nedarys (t_begin), ir kitą kuo arčiau pabaigos (t_end) . Beveik visos „LineProfiler“ duomenų struktūros pridėtinės išlaidos vyksta tarp šių dviejų kartų.

Atėjus eilutės įvykiui, „LineProfiler“ suranda jam priklausančią funkciją. Jei tai pirmoji funkcijos eilutė, įrašome eilutės numerį ir t_end susieta su funkcija. Kitą kartą, kai pamatysime eilutės įvykį, priklausantį tai funkcijai, paimame naujo įvykio t_binin ir atimame iš jo senąjį t_end, kad rastume laiko, praleisto senoje eilutėje, kiekį. Tada mes įrašome naują t_end kaip aktyvią šios funkcijos eilutę. Tokiu būdu mes pašaliname didžiąją dalį „LineProfiler“ pridėtinių išlaidų iš rezultatų. Na beveik. Kai viena profiliuota funkcija F iškviečia kitą profiliuotą funkciją G, linija F, kuri iškviečia G, iš esmės įrašo visą laiką, praleistą vykdant liniją, įskaitant laiką, praleistą profilyje, o viduje G.

Pirmą kartą uždavus šį klausimą, klausėjas turėjo funkcijos G () iškvietimą kaip didesnės išraiškos dalį, ir jis norėjo pabandyti įvertinti, kiek laiko praleista funkcijoje, palyginti su likusia išraiška. Mano atsakymas buvo tas, kad net jei galėčiau pašalinti efektą, jis vis tiek gali būti klaidinantis. G () gali būti vadinamas kitur, ne tik iš atitinkamos F () eilutės. Sprendimas būtų modifikuoti kodą, kad jis būtų padalytas į dvi eilutes: viena tiesiog priskiria G () rezultatą laikinam kintamajam, o kita - likusiai išraiškai.

Esu atviras pasiūlymams, kaip tai padaryti patikimesne. Arba paprasti įspėjimai prieš bandymą būti sumaniems.

Kodėl mano sąrašo supratimas turi tiek daug įvykių, kai naudoju „LineProfiler“?

„LineProfiler“ įrašo eilutę su sąrašo supratimu vieną kartą kiekvienai sąrašo supratimo iteracijai.

Kodėl kernprof platinamas su line_profiler? Jis veikia tik su „cProfile“, tiesa?

Iš dalies todėl, kad kernprof.py yra būtinas norint efektyviai naudoti line_profiler, tačiau daugiausia dėl to, kad esu tingus ir nenoriu išlaikyti dviejų tokių mažų modulių projektų pridėtinių išlaidų. Tačiau kernprof.py yra atskiras, grynas „Python“ scenarijus, kurį galima naudoti funkcijų profiliavimui naudojant tik „Python“ standartinę biblioteką. Galite jį paimti ir įdiegti patys be „line_profiler“.

Ar man reikia C kompiliatoriaus, norint sukurti line_profiler? kernprof.py?

Line_profiler jums reikia C kompiliatoriaus. kernprof.py yra grynas „Python“ scenarijus, kurį galima įdiegti atskirai.

Ar man reikia „Cython“, norint sukurti „line_profiler“?

Jūs neturėtumėte to daryti, jei kuriate iš paleisto šaltinio „tarball“. Jame jau turėtų būti sugeneruoti C šaltiniai. Jei kyla problemų, praneškite man apie klaidą. Jei kuriate iš „git“ kasos ar momentinės kopijos, jums reikės „Cython“, kad sugeneruotumėte C šaltinius. Jums tikriausiai reikės 0.10 ar naujesnės versijos. Kai kuriose ankstesnėse versijose yra klaida, kaip ji tvarko NULL PyObject * rodykles.

Nuo 3.0.0 versijos „pypi“ galima įsigyti ratus, kuriuose yra dvejetainiai failai. Vis dar reikia dirbti norint išleisti „OSX“ ir „Win32“ ratus. (Tai būtų naudinga!)

Kokios „Python“ versijos man reikia?

Ir line_profiler, ir kernprof buvo išbandyti naudojant Python 3.5-3.9. Senesnės „line_profiler“ versijos palaiko senesnes „Python“ versijas.

„cProfile“ naudoja tvarkingą „besisukančių medžių“ duomenų struktūrą, kad sumažintų pridėtines išlaidas ieškant ir įrašant įrašus. „LineProfiler“ naudoja „Python“ žodynus ir plėtinių objektus „Cython“ dėka. Tai dažniausiai prasidėjo kaip prototipas, su kuriuo norėjau žaisti kuo greičiau, todėl kol kas perdaviau besisukančių medžių vogimą. Kaip įprasta, man tai pavyko ir atrodo, kad jo rezultatai yra priimtini, todėl dabar esu kur kas mažiau motyvuota naudoti kitą strategiją. Galbūt vėliau. Priėmimai priimami!


Literatūra

Mannas, K. H. ir amp. Lazier, J. R. Jūrų ekosistemų dinamika: biologinė-fizinė sąveika vandenynuose. (John Wiley & amp Sons, 2013).

Minns, C. K. ir amp. Wichert, G. A. Žuvų buveinių sričių apibrėžimo Ontarijo ežere ir jo drenažas pagrindai. J. Didieji ežerai Res. 31, 6–27 (2005).

Håkanson, L. Vėjo, nuotėkio ir vandens gylio įtaka nuosėdų pasiskirstymui Vänern ežere, Švedijoje. Gali. J. Žemės mokslai. 14, 397–412 (1977).

Burtonas, T. M., Uzarski, D. G. ir amp Genet, J. A. bestuburių buveinių naudojimas atsižvelgiant į Šiaurės Hurono ežero pakrantės pelkių parsivežimą ir augalų zonavimą. Vandens ekosistemos sveikata ir valdymas 7 (2), 249–267, https://doi.org/10.1080/14634980490461614 (2004).

Marshas, ​​W. M. ir amp. Marshas, ​​B. D. Vėjo erozija ir smėlio kopų susidarymas aukšto aukšto ežero blefuose. Geografinis pavadinimas Ann 69A, 379–391 (1987).

Schwab, D. J., Beletsky, D. & amp Lou, J. 1998 m. Pakrantės drumstumo plunksna Mičigano ežere. Žiočių, pakrančių ir lentynų mokslas 50, 49–58 (2000).

Randall, R. G., Minns, C. K., Cairns, V. W. & amp Moore, J. E. Ryšys tarp žuvų gamybos indekso ir panardintų makrofitų bei kitų buveinių ypatybių trijose Didžiųjų ežerų pakrantės srityse. Gali. J. Aquat. Sci. 53, 35–44 (1996).

Cooperis, M. J., Lamberti, G. A. ir ampar Uzarski, D. G. Didžiųjų ežerų pakrančių pelkių bestuburių bendruomenių erdvinės ir laikinės tendencijos, akcentuojant Hurono ežero Saginaw įlanką. J. Didieji ežerai Res. 40, 168–182 (2014).

Keddy, P. A. Kranto augmenija Axe ežere, Ontarijas: poveikio poveikis zonavimo modeliams. Ekologija 64, 331–344 (1983).

Yurista, P. M., Kelly, J. R. ir amp. Scharoldas, J. V. Didieji ežerai prie jūros - jūroje: Skirtingi vandens kokybės regionai. J. Didieji ežerai Res. 42, 375–385 (2016).

Beletsky, D., Hawley, N. & amp Rao, Y. R. Vasaros cirkuliacijos ir šiluminės Erie ežero struktūros modeliavimas. J. iš „Geophys“. Res. Vandenynai 118, 6238–6252, https://doi.org/10.1002/2013JC008854 (2013).

Shuter, B. J., Schlesinger, D. A. ir amp. Zimmerman, A. P. Empiriniai metinių paviršiaus vandens temperatūros ciklų prognozatoriai Šiaurės Amerikos ežeruose. Gali. J. Žuvis. „Aquat“. Sci. 40, 1838–1845 (1983).

Plattner, S., Mason, D. M., Leshkevich, G. A., Schwab, D. J. & amp Rutherford, E. S. Pakrančių pakylų klasifikavimas ir prognozavimas Mičigano ežere naudojant palydovinius temperatūros vaizdus ir plūdurų duomenis. J. Didieji ežerai Res. 32, 63–76 (2006).

Mičigano ežere žydi Vanderploeg, H. A., Liebig, J. R., Nalepa, T. F., Fahnenstiel, G. L. & amp Pothoven, S. A. Dreissena ir pavasario fitoplanktono išnykimas. J. Didieji ežerai Res. 36, 50–59, https://doi.org/10.1016/j.jglr.2010.04.005 (2010).

Uzarski, D. G., Burtonas, T. M. ir amp Genet, J. A. Hurono ežero ir Mičigano pakraščių pelkių bestuburių biologinio vientisumo indekso patvirtinimas ir atlikimas ežero lygio nuosmukio laikotarpiu. „Aquat“. „Ecosyst“. Sveikata 7, 269–288 (2004).

Clarkas, J. E. In Pelkių funkcijos ir vertybės: mūsų supratimo būklė (red. Greeson, P. E., Clark J. R. & amp Clark J. E.) Gėlavandenės pelkės: vandens bestuburių, varliagyvių, roplių ir žuvų buveinės. Techninių leidinių serija TP79-2. (Amerikos vandens išteklių asociacija: Mineapolis, MN, 1978).

Jude, D. J. ir amp Pappas, J. Didžiųjų ežerų pakrančių pelkių žuvų panaudojimas. J. Didieji ežerai Res. 18, 651–692 (1992).

Wang, L. ir kt. Erdvinė klasifikacija ir duomenų bazė valdymui, tyrimams ir politikos formavimui: Didžiųjų ežerų vandens buveinių sistema. J. Didieji ežerai Res. 41, 584–596 (2015).

Larson, G. & amp Schaetzl, R. Apžvalga: Didžiųjų ežerų kilmė ir evoliucija. J. Didieji ežerai Res. 27, 518–546 (2001).

Waplesas, J. T. ir amp. Klumpas, J. V. Dešimtmečio poslinkio vasaros vėjo kryptimi virš Laurentiano didžiųjų ežerų biofizinis poveikis. Geofiziniai duomenys. Laiškai 29, 8 (2002).

Kalffas, Dž. Limnologija: vidaus vandens ekosistemos (Upper Saddle River, N.J, 2002).

Håkanson, L. A. Morfometrijos ežero vadovas (Berlynas: Springer-Verlag, 1981).

JAV armijos inžinierių korpusas (USACE). Apsaugos nuo kranto vadovas. Pakrančių inžinerijos tyrimų centras: Fort Belvoir, Virdžinija, (1984).

Keddy, P. A. Bangos energijos gradientų kiekio ežere nustatymas: bangų energijos, substrato dalelių dydžio ir kranto augalų sąsajos Axe Lake, Ontarijo mieste. Vandens botanika 14, 41–58 (1982).

Forsythas, D. K. ir kt. Didžiųjų ežerų hidrografijos duomenų rinkinys: nuoseklūs, dvipusiai vandens telkiniai Laurentiano didžiųjų ežerų baseinui. J. Am. Vandens telkinys. Kaip 52, 1068–1088 (2016).

Andersonas, E. J. ir amp. Schwabas, D. J. Spekuliuojantis dvikryptis mainų srautas Mackinac sąsiauryje. J. Didieji ežerai Res. 39, 663–671 (2013).

Finlaysonas, D. „Puget Sound Fetch“: Sietlas, Vašingtonas. Daktaro disertacija. (Vašingtono universitetas, 2005).

Rohweder, J. ir kt. Vėjo gaudymo ir bangų modelių taikymas buveinių atstatymo ir gerinimo projektams. JAV geologijos tarnybos atviros bylos ataskaita 2008–1200, 43 p (2008).

Desai, A. R., Austinas, J. A., Benningtonas, V. ir amp. McKinley, G. A. Stipresnis vėjas virš didelio ežero, reaguodamas į oro ir ežero temperatūros gradiento silpnėjimą. Gamtos geomokslas 2, 855–858, https://doi.org/10.1038/NGEO693 (2009).

Straskraba, M. In Gėlo vandens ekosistemų veikimas (red. LeCren, E. D.) Fizikinių kintamųjų poveikis gėlo vandens gamybai: analizės, pagrįstos modeliais (Cambridge Univ. Press, Cambridge, 1980).

Duomenų šaltiniai

Mason, L. A., Riseng, C. M., Layman, A. J. ir amp. Jensen, R. Mičigano universitetas https://doi.org/10.7302/z22f7kn3 (2018)