geologyidea.com
Viac

Zobrazujú sa nesprávne výsledky vo vyhľadávacom kurzore skriptu ArcPy / Python?

Zobrazujú sa nesprávne výsledky vo vyhľadávacom kurzore skriptu ArcPy / Python?


We are searching data for your request:

Forums and discussions:
Manuals and reference books:
Data from registers:
Wait the end of the search in all databases.
Upon completion, a link will appear to access the found materials.


Mám dve funkcie:

  1. Prvý z nich vytvorí vrstvu funkcií
  2. druhá bude mať prístup k rovnakej vytvorenej vrstve a vytlačí výsledok.

pri prvom spustení skriptu vypíše nesprávne výsledky. keď ho spustím druhýkrát, vypíše správny výsledok ...

Prvýkrát spustený skript nesprávneho výsledku:

získanie prístupu k vrstve mapy 2

(viackrát opakované)

.

Správny výsledok: Spustený skript druhýkrát 1. vrstva, ktorá sa vytvára, obsahuje iba 5 riadkov, takže môj skript vytlačí iba 5 správ

získanie prístupu k vrstve mapy 1

opakuje sa pre všetky vrstvy.

Scenár:

# import system systems import arcpy import math import sys import traceback from arcpy import env # Class to Build Boundry of Districts class Build_Boundry: def __init __ (self, workSpace, mapLayerFinal, censusLayer, totalDistricts, mxdLocation): self.workSpace = workSpace self.censusLayer = censusLayer self.mapLayerFinal = mapLayerFinal self.totalDistricts = totalDistricts self.mxdLocation = mxdLocation # Funkcia na výpočet priemeru celkového počtu voličov v každej oblasti ohraničujúcej hranice (seba): arcpy.AddMessage ("Budovanie hranice okresov"), ak arcpy.Exists ( self.mapLayerFinal): arcpy.AddMessage ("Layer Already Exist ...") tlačiť (self.mapLayerFinal) else: arcpy.MakeFeatureLayer_management (self.censusLayer, self.mapLayerFinal, "DISTRICT_ID MEDZI 1 A" + strist (self.totD) self.workSpace) # Vykonať Rozpustiť pomocou LANDUSE a TAXCODE ako Rozpustiť polia arcpy.Dissolve_management (self.mapLayerFinal, str (self.workSpace) + "/" + str (self.mapLayerFinal), "DISTRICT_ID", "", "MULTI_PART" , „DISSOLVE_LINES“) s rint (self.mapLayerFinal) arcpy.AddMessage ("Hranica vypočítaných okresov") mxd = arcpy.mapping.MapDocument (self.mxdLocation) df = arcpy.mapping.ListDataFrames (mxd, "") [0] addLayer = arcpy.mapping .Layer (self.mapLayerFinal) arcpy.mapping.AddLayer (df, addLayer, "BOTTOM") mxd.save () arcpy.RefreshTOC () del mxd, addLayer návrat; # Trieda na výpočet kompaktnosti Trieda Calculate_Compactness: def __init __ (self, workSpace, mapLayerFinal): self.workSpace = workSpace self.mapLayerFinal = mapLayerFinal # Funkcia na výpočet kompaktnosti def compactness_quotient (self): arcpy.AddMessage ("Výpočet" kompaktnosti Quot arcpy.da.SearchCursor (self.mapLayerFinal, ["Shape_Area", "DISTRICT_ID", "Shape_Length"]) ako riadky: print "vrstva" + str (self.mapLayerFinal) pre riadok v riadkoch: area = riadok [0] district_id = riadok [1] obvod = riadok [2] tlač „získanie prístupu k vrstve mapy“ + str (district_id) tlač „výpočet kalkulácie kompaktnosti dokončený“ návrat; folder = "C: / Users / Abrar ahmad / Desktop / CASES / Rural / Case_1_Boundary_Input" mxdLocation = r "C: / Users / Abrar ahmad / Desktop / CASES / Rural / Case_1_Boundary_Input / New_Rwp_Cencus.mxd" workSpace = "C: / Users / Abrar ahmad / Desktop / CASES / Rural / Case_1_Boundary_Input / Selected_BU2.gdb "env.workspace = workSpace censusLayer =" Rural_Area_Rwp "districtsLayer =" Existujúci_District_Boundary "totalDistricts = int (5) mapLayerFinal = str Build Boundry boundry = Build_Boundry (workSpace, mapLayerFinal, censusLayer, totalDistricts, mxdLocation) boundry.boundry () cc = Calculate_Compactness (workSpace, mapLayerFinal) cc.compactness_quotient ()

Existuje premenná, ktorá koliduje v MakeFeatureLayer a Dissolve_Management. zmenil na temp_layer

arcpy.MakeFeatureLayer_management (self.censusLayer, "tmp_Layer", "DISTRICT_ID MEDZI 1 A" + str (self.totalDistricts), self.workSpace) # Execute Dissolve pomocou LANDUSE a TAXCODE ako Dissolve Fields arcpyer "" self.workSpace) + "/" + str (self.mapLayerFinal), "DISTRICT_ID", "", "MULTI_PART", "DISSOLVE_LINES")

Globálne súradnice a vypočítajte vzdialenosť.

Súradnice oka sú najskôr lokálne a kurzor scény je globálny. Buď prevádzajte kurzor scény na miestny

a potom pri pridávaní prázdneho výsledku výsledok späť na globálny.

To by vyžadovalo iba 2 násobenia matice.

alebo preveďte súradnice oka na globálne (vykonali ste to nižšie)

pretože nepíšeme späť do bmesh, takže sa to neodrazí natrvalo.

Čo robí najbližší bod na linke.

Nájde vráti bod na priamke najbližšie k bodu a koľko percent je to od začiatočného bodu, tj 0 je počiatočný bod, 1 druhý koniec. Nejde to mimo čiaru.

V príklade vyššie majú obidva rovnaké výsledky, zatiaľ čo jeden je priamo v strede čiary, druhý nie. Na obrázku je tiež zrejmé, že výsledkom je najmenší pomer od rohu aka hrana vert 0. Prevrátením normálov sa zmení poradie vrcholov a tento výsledok sa znova posunie, ak je to 10% od rohu (ako je), bude to 90% s navinutými Verts opačným spôsobom.

Namiesto toho vypočítajte vzdialenosť odčítaním zásahu od umiestnenia kurzora.

Zmenili ste kód tak, aby pridával prázdne v uzatváracom bode všetkých okrajov, a nie iba v nulovej tvári.

Ostatné konštrukcie pre min / max

Namiesto toho, aby ste nastavili veľmi vysokú hodnotu ako max a testovali počas každej iterácie, existujú aj iné spôsoby, ako nájsť minimum a maximum (v tomto je numpy mimoriadne dobrá)

Ďalším je zostaviť zoznam všetkých prístupov a zoradiť ich. Nula bude najbližšia, posledná najďalej.


Pokazenie kódovania ArcPy a Python?

Stretávam sa s podivným správaním medzi kódovaním ArcPy a Python. Pracujem s programom VisualStudio 2010 Shell s nainštalovanými nástrojmi Python pre VS (PTVS). Svoj problém som izoloval pomocou jednoduchého súboru skriptu. Súbor skriptu py, ktorý obsahuje nasledujúce príkazy. Vo VisualStudiu som nastavil «Pokročilé možnosti ukladania. »Až« UTF-8 bez podpisu ». Skript jednoducho vytlačí na obrazovku reťazec s prízvukom, potom naimportuje arcpy modul a potom znova vytlačí ten istý reťazec. Zdá sa, že importovanie Arcpy mení nastavenie kódovania Pythonu, ale neviem prečo a rád by som ho správne obnovil, pretože v pôvodnom skripte spôsobuje všade trochu problémy.

Skontroloval som priečinok python «encoding» a vymazal som každý súbor pyc. Potom som spustil skript a vygeneroval 3 súbory pyc:

  1. cp850.pyc (čo zodpovedá môjmu stdout.encoding)
  2. cp1252.pyc (čo zodpovedá môjmu kódovaniu prostredia Windows)
  3. utf_8.pyc (čo zodpovedá kódovaniu môjho skriptu)

Pri importovaní ArcPy niečo zmení kódovanie, ktoré ovplyvňuje počiatočné premenné.

Je možné pomocou nejakého príkazu v Pythone zistiť, kde sa nachádza kódovanie ArcPy cp1252, a prečítať si ho, aby som mohol vytvoriť funkciu, ktorá sa tým zaoberá?

a keď spustím skript, dostanem tieto výsledky:

Načítané kódovanie: ascii
Nastaviť kódovanie: utf-8

Typ originálu: typ „unicode“
Originálny text: Récuperation des données & lt --- Toto je správne

import arcpy
Načítané kódovanie: utf-8

arcpy pokaziť pôvodný typ: zadajte 'unicode'
arcpy pokaziť pôvodný text: R'cuperation des donn'es> & lt --- Toto je nesprávne
arcpy pokaziť ReEncode s typom cp1252: typ 'str'
arcpy pokaziť ReEncode s textom cp1252: Récuperation des données> & lt --- Toto sa hodí k pôvodnému unicode


Dostupné kontextové členy závisia od oblasti mixéra, ktorá je momentálne prístupná.

Mnoho operátorov má funkciu „hlasovania“, ktorá môže skontrolovať, či je myš platnou oblasťou alebo či je objekt v správnom režime (režim úprav, váženie farieb atď.). Keď funkcia dotazovania operátora zlyhá v pythone, vyvolá sa výnimka.

Viac informácií o používaní operátorov a dôvodoch, prečo sa vyskytli zlyhania dotazovania (myš nie je nad oblasťou pravej obrazovky alebo nesprávny režim / iné predbežné podmienky). Prečítajte si o tom aj sekciu Gotchas v dokumentoch API.

  1. Spustite operátora pomocou ponuky medzerníka (pozri dolná časť sekcie) v Blenderi 2.7x alebo pomocou F3 ako Blenderu 2.8x z príslušnej oblasti (bl_options nesmie obsahovať „INTERNAL“)
  2. Zadajte správne kontext vykonania za volanie operátora (tým sa opraví kontextová chyba iba pre niektorých!)
    (Dokumenty API, príklad)
  3. Použite prepísanie na odovzdanie požadovaných argumentov kontextu
  4. Dočasne zmeňte typ Area.type
  5. Pomocou funkcií API „na nízkej úrovni“ môžete dosiahnuť rovnaký výsledok bez starostí s kontextom

Prepísať

Zdá sa, že nefunguje pre tohto operátora ?! Pridáva pozadie, ale bez názvu / textúry.

Mimochodom:
Môžete zadať prázdny diktát (napríklad bpy.ops.example.operator (<>)), ktorý zvyčajne vytlačí varovania na systémovú konzolu o chýbajúcich členoch kontextu. Musíte týchto členov zložiť a opakovať, kým sa už nebude sťažovať. Dajte si však pozor na určitých operátorov, ktorí požadujú základy scény - ak na ne neposkytnete odkaz, Blender sa zrúti na plochu skôr, ako zistíte, že sú potrebné.

Zmeniť typ oblasti

Nízky level

Podobné prepísaniu potrebujete inštanciu 3D zobrazenia, v tomto prípade jej vesmírne údaje (pretože toto je miesto, kde sa nachádzajú pozadia). Nasledujúci kód zachytáva prvé 3D zobrazenie aktuálneho rozloženia obrazovky (ak existuje), pridáva nové pozadie a nastavuje obraz na databázový blok obrázkov:


3 odpovede 3

Myslím si, že všetky tieto odpovede sú a) príliš komplikované ab) vychádzajú z porovnania s tým, čo chce používateľ2023861 dosiahnuť:

„Pokúšam sa deklarovať premennú, potom ju vyberte.“ znamená dve rôzne veci v PL / SQL alebo v SQLplus a možno ďalšie dve veci v DBArtisan. Na dosiahnutie cieľa v SQLplus použite "Substitučné premenné". vynikajúce zázemie sa nachádza tu.

Môj príklad presne nesleduje váš príklad T-SQL servera SQL Server, ale je blízky a NIE je procedurálny (čítanie: žiadny anonymný blok PL / SQL.)

PL / SQL so substitučnými premennými:

Všetko na výzvu SQL-Plus. z mojej tabuľky fiktívnych zamestnancov som dostal tento výsledok:

Ak to chcete urobiť čiastočne procedurálne, použijete premenné BIND a deklaratívnu syntax PL / SQL podobnú T-SQL. (Podľa môjho názoru je to OBROVSKÉ mrhanie úsilím, ale je zahrnuté v texte, aby pomohlo objasniť typy premenných.)

SQLPlus pomocou premenných PL / SQL Bind:

Plne procedurálny prístup využívajúci PL / SQL:

Kedy teda použijem jednotlivé prípady? Používam substitučné premenné SQLplus 75% času, keď píšem skripty SQL, pre ktoré chcem parametrizovať vstup. Spustenie skriptu vo výzve SQLplus umožňuje odovzdanie prichádzajúcich argumentov, takže moje obľúbené substitučné premenné sú & amp1 a & amp2, ako v nasledujúcom príklade:

a vykonáva podobný kód ako

Všimnite si, ako sú prichádzajúce argumenty priradené do substitučných premenných, ktoré sa potom použijú v príkaze SQL. Nikdy nepoužívam stredný príklad a vždy tretie príklady (procedurálne PL / SQL) používam pri písaní funkcií, procs a balíkov.


Zobrazujú sa nesprávne výsledky vo vyhľadávacom kurzore skriptu ArcPy / Python? - Geografické informačné systémy

Toto je Python verzia 3.11.0 alfa 0

Autorské práva (c) 2001-2021 Python Software Foundation. Všetky práva vyhradené.

Na konci tohto súboru nájdete ďalšie informácie o autorských právach a licenciách.

  • Webové stránky: https://www.python.org
  • Zdrojový kód: https://github.com/python/cpython
  • Sledovač problémov: https://bugs.python.org
  • Dokumentácia: https://docs.python.org
  • Príručka pre vývojárov: https://devguide.python.org/

Podrobnejšie pokyny týkajúce sa prispievania k vývoju CPython nájdete v príručke pre vývojárov.

Inštalovateľné súpravy Python a informácie o používaní Pythonu sú dostupné na stránke python.org.

V systémoch Unix, Linux, BSD, macOS a Cygwin:

Týmto sa nainštaluje Python ako python3.

Spusteniu konfiguračného skriptu môžete odovzdať veľa možností ./configure --help a zistiť viac. V súborových systémoch nerozlišujúcich veľké a malé písmená v systéme macOS a v systéme Cygwin sa spustiteľný súbor nazýva python.exe, inde je to iba python.

Vytvorenie kompletnej inštalácie Pythonu si vyžaduje použitie rôznych ďalších knižníc tretích strán, v závislosti od vašej platformy zostavenia a možností konfigurácie. Nie všetky štandardné moduly knižnice je možné zostaviť alebo použiť na všetkých platformách. Aktuálne podrobné informácie o závislostiach pre rôzne distribúcie systému Linux a macOS nájdete v časti Inštalácia závislostí v Príručke pre vývojárov.

V systéme macOS existujú ďalšie možnosti konfigurácie a zostavenia súvisiace s rámcom macOS a univerzálnymi zostavami. Pozrite si Mac / README.rst.

Ak chcete, môžete vytvoriť podadresár a odtiaľ vyvolať konfiguráciu. Napríklad:

(Toto zlyhá, ak tiež postavený v adresári najvyššej úrovne. Najskôr by ste mali urobiť make up na najvyššej úrovni.)

Ak chcete získať optimalizované zostavenie Pythonu, nakonfigurujte --enable-optimalizations pred spustením make. Toto nastavuje predvolené cieľové cieľové hodnoty tak, aby umožňovali profilovú optimalizáciu (PGO), a na niektorých platformách sa môžu použiť na automatické povolenie optimalizácie času spojenia (LTO). Ďalšie informácie nájdete v častiach uvedených nižšie.

PGO využíva výhody najnovších verzií prekladačov GCC alebo Clang. Ak sa použije, buď prostredníctvom configure --enable-optimizations alebo manuálnym spustením make profile-opt bez ohľadu na príznaky konfigurácie, optimalizovaný proces zostavenia vykoná nasledujúce kroky:

Celý adresár Pythonu je vyčistený od dočasných súborov, ktoré mohli byť výsledkom predchádzajúcej kompilácie.

Je zostavená inštrumentovaná verzia tlmočníka, ktorá používa vhodné príznaky kompilátora pre každú príchuť. Upozorňujeme, že toto je iba sprostredkovateľský krok. Binárna hodnota vyplývajúca z tohto kroku nie je vhodná pre pracovné zaťaženie v reálnom živote, pretože má vnútri vložené pokyny na profilovanie.

Po zostavení prístrojového tlmočníka spustí Makefile školiace pracovné zaťaženie. Je to nevyhnutné na zviditeľnenie výkonu tlmočníka. Upozorňujeme tiež, že akýkoľvek výstup, štandardný výstup aj stderr, ktorý sa môže zobraziť v tomto kroku, je potlačený.

Posledným krokom je zostavenie skutočného tlmočníka na základe informácií zhromaždených od inštrumentovaného. Konečným výsledkom bude binárny kód Pythonu, ktorý je optimalizovaný pre distribúciu alebo produkčnú inštaláciu.

Povolené pomocou parametra --with-lto v konfigurácii. LTO využíva schopnosť posledných reťazcov nástrojov kompilátora optimalizovať cez inak ľubovoľnú hranicu súboru .o pri vytváraní konečných spustiteľných súborov alebo zdieľaných knižníc na ďalšie zvýšenie výkonu.

Máme komplexný prehľad o zmenách v dokumente Čo je nové v Pythone 3.10. Podrobnejší denník zmien nájdete v časti Rôzne / SPRÁVY, ale úplné vyúčtovanie zmien je možné získať iba z histórie potvrdenia.

Ak chcete nainštalovať viac verzií Pythonu, prečítajte si časť s názvom „Inštalácia viacerých verzií“.

Dá sa tiež stiahnuť v mnohých formátoch pre rýchlejší prístup. Dokumentácia je k dispozícii na stiahnutie vo formátoch HTML, PDF a reStructuredText. Druhá verzia je určená predovšetkým pre autorov dokumentácie, prekladateľov a ľudí so špeciálnymi požiadavkami na formátovanie.

Informácie o vytváraní dokumentácie Pythonu nájdete v dokumente Doc / README.rst.

Vo vydaní Pythonu 3.0 boli urobené významné spätne nekompatibilné zmeny, ktoré môžu spôsobiť zlyhanie programov napísaných pre Python 2 pri spustení s Pythonom 3. Ďalšie informácie o prenose vášho kódu z Pythonu 2 do Pythonu 3 nájdete v Portingu HOWTO.

Ak chcete vyskúšať tlmočníka, zadajte make test do adresára najvyššej úrovne. Testovacia súprava produkuje určitý výstup. Správy o vynechaných testoch môžete zvyčajne ignorovať kvôli voliteľným funkciám, ktoré nie je možné importovať. Ak sa vytlačí správa o neúspešnom teste alebo sa vytvorí spätné sledovanie alebo výpis jadra, niečo nie je v poriadku.

Predvolene sa testom zabráni v nadmernom využívaní zdrojov, ako sú miesto na disku a pamäť. Ak chcete tieto testy povoliť, spustite príkaz make testall.

Ak niektoré testy zlyhajú, môžete zlyhajúce testy znova spustiť v podrobnom režime. Napríklad, ak test_os a test_gdb zlyhali, môžete spustiť:

Ak zlyhanie pretrváva a zdá sa, že ide skôr o problém s Pythonom, ako s vašim prostredím, môžete podať hlásenie o chybe a zahrnúť relevantný výstup z tohto príkazu, ktorý problém ukáže.

Ďalšie informácie o spustení testov nájdete v časti Testy písania Beh a zosilňovač.

Ak v systémoch Unix a Mac plánujete inštalovať viac verzií Pythonu s rovnakou predponou inštalácie (argument --prefix konfiguračného skriptu), musíte dbať na to, aby nebol spustený primárny spustiteľný súbor pythonu prepísaný inštaláciou inej verzie. Všetky súbory a adresáre nainštalované pomocou make altinstall obsahujú hlavnú a vedľajšiu verziu a môžu tak žiť vedľa seba. make install tiež vytvorí $/ bin / python3, ktorý odkazuje na $/bin/pythonX.Y. Ak chcete inštalovať viac verzií s rovnakou predponou, musíte sa rozhodnúť, ktorá verzia (ak existuje) je vašou „primárnou“ verziou. Nainštalujte túto verziu pomocou príkazu make install. Nainštalujte všetky ostatné verzie pomocou make altinstall.

Napríklad, ak chcete nainštalovať Python 2.7, 3.6 a 3.10, pričom primárnou verziou je 3.10, vykonáte make install vo vašom adresári zostavenia 3.10 a v ďalších urobíte altinstall.

Hlásenia chýb sú vítané! Pomocou nástroja na sledovanie problémov môžete hlásiť chyby alebo odosielať žiadosti o načítanie na GitHub.

Môžete tiež sledovať diskusiu o vývoji v zozname adries python-dev.

Ak máte návrh na zmenu Pythonu, možno budete chcieť poslať e-mail do e-mailovej konferencie comp.lang.python alebo python-ideas na úvodnú spätnú väzbu. Ak sa váš nápad presadí, možno predložiť návrh na vylepšenie Pythonu (PEP). Všetky súčasné PEP, ako aj pokyny na odoslanie nového PEP, sú uvedené na stránke python.org/dev/peps/.

Podrobnosti o vydaní Pythonu 3.10 nájdete na PEP 619.

Autorské práva (c) 2001-2021 Python Software Foundation. Všetky práva vyhradené.

Autorské práva (c) 2000 BeOpen.com. Všetky práva vyhradené.

Copyright (c) 1995-2001 Corporation for National Research Initiatives. Všetky práva vyhradené.

Autorské práva (c) 1991-1995 Stichting Mathematisch Centrum. Všetky práva vyhradené.

V časti LICENCIA nájdete informácie o histórii tohto softvéru, podmienkach a podmienkach používania a ZRIEKNUTIE SA VŠETKÝCH ZÁRUK.

Táto distribúcia v Pythone obsahuje č Kód GNU General Public License (GPL), takže ho možno použiť v proprietárnych projektoch. K niektorému kódu GNU existujú rozhrania, ale sú úplne voliteľné.

Všetky tu uvedené ochranné známky sú majetkom ich príslušných držiteľov.


Skratky na najvyššej úrovni

Miestna ponuka Aktuálna relácia

Vymaže všetky výsledky v zozname Aktuálna relácia. Všetky výstupné súbory údajov, na ktoré sa vzťahujú výsledky, budú odstránené, ako aj všetky vstupné prvky alebo množiny záznamov (údaje vytvorené pomocou interaktívnych prvkov alebo vstupu do riadkov). Ak vyberiete možnosť Odstrániť všetko, otvorí sa okno so správou s otázkou, či chcete skutočne odstrániť všetky výstupné údaje.

Odstráni všetky informácie o výsledku zo zoznamu. Neodstránia sa žiadne výstupné údaje.

Rýchla ponuka Predchádzajúce relácie

Odstráni všetky výsledky zo zoznamu Predchádzajúca relácia. Nebudú odstránené žiadne výstupné údaje.

Nie je možné spustiť miestnu ponuku

Ak ukončíte a uložíte mapový dokument, keď sú nástroje spustené alebo čakajú na spracovanie, všetky spustené a nespracované nástroje sa zobrazia ako výsledok pod položkou Nespustené.

Odstráni všetky výsledky zo zoznamu Nie je spustené. Nebudú odstránené žiadne výstupné údaje.

Vykoná všetky nástroje. Výsledky sa odstránia z položky Nebežať a pridajú sa k aktuálnej relácii.

Zdieľané

Pre zdieľaný uzol neexistuje žiadna kontextová ponuka.


Skript pre migráciu MySQL na PostgreSQL

Pracujem na skripte Python na migráciu databázy MySQL do databázy PostgreSQL s inou schémou (rôzne tabuľky, iné dátové typy atď.).

Som sysadmin a bohužiaľ nekódujem veľmi často. Takže mám pochybnosti o tejto počiatočnej fáze programovania.

Začínam s tabuľkami, ktoré sa dajú ľahko migrovať (takmer rovnaká štruktúra), ale veľmi skoro budem musieť preniesť tabuľky, ktoré na zaistenie kompatibility potrebujú ďalšie operácie.

Môj kód v skutočnosti vyzerá takto:

Ako si všimnete, v každej časti skriptu je štruktúra takmer rovnaká:

  • Vyberte údaje z tabuľky zdrojovej databázy (mysql), o výsledok sa postará kurzor s vlajkou slovníka (slovník pythonu).
  • Potom je slovník iterovaný v rámci cyklu for, kde je to možné, napr. odlievacie polia, alebo prispôsobte štruktúru tabuľky (pozri časť: A2.right> A3.permission).
  • A stále vo vnútri cyklu for, je každý záznam vložený do cieľovej databázy.

Otázky / pochybnosti:

Musím vytvoriť triedu, aby som abstrahoval nadbytočný kód? Alebo je lepšie vytvoriť iba funkciu? Môže niekto uviesť krátky príklad? Nemám predstavu, ako postupovať.
V oboch prípadoch vidím nejaké problémy s jeho abstrahovaním, pretože redundantný kód je vo vnútri slučky, kde budem musieť robiť rôzne operácie v závislosti od toho, akú tabuľku iterujem.

Pri každej operácii (časť skriptov) som zvykol otvárať a zatvárať kurzory, potom som sa rozhodol otvoriť oba kurzory na začiatku skriptu a používať ich až do konca a zavrieť ich. Ale teraz som to čítal a som zmätený. Čo je podľa teba lepšie? Jeden kurzor pre každú operáciu alebo jeden kurzor pre celý skript?


4 odpovede 4

Na niečo podobné používam balíček s názvom yasnippet. Po niekoľkých menších zmenách som ho prispôsobil tak, aby používal namiesto toho štýl dokumentácie Google:

Upozorňujeme však, že to vyžaduje určité nastavenie:

Samotný úryvok musí na vygenerovanie textu spustiť nejaký elisp kód obslužného programu. Toto sa zvyčajne rieši vytvorením súboru s názvom .yas-setup.el s kódom v adresári úryvkov fragmentu režimu python. Je však tiež možné umiestniť kód niekde do vášho súboru .emacs.

Kód úryvku je:

Kód súboru .yas-setup.el je:

Všimnite si, že python-split-args poskytuje štandard úryvky. Tj. Https://github.com/AndreaCrotti/yasnippet-snippets/tree/master Tie však dostanete predvolene pri inštalácii balíka cez package.el.

Pri správnom nastavení všetkého by ste mali byť schopní napísať „defg“ a za nimi Tab, aby ste fragment rozšírili (príklad nájdete na obrázku).

Stále existuje problém s používaním tohto vo vnorenom odsadení, napr. V rámci tried alebo ako vnorené funkcie. V týchto prípadoch je dokumentačný blok z nejakého dôvodu chybne odsadený o čas navyše. Ak sa mi to podarí opraviť, tento príspevok aktualizujem.

Fragment by teraz mal fungovať vo vnútri iných rozsahov tak, že zakáže automatickému odsadeniu druhého rozšírenia yasnippet.


9 odpovedí 9

Niekoľko myšlienok, ktoré mi napadnú, bez toho, aby som tvoj profil skutočne profiloval:

  1. Skúste zadať std :: string ako referenciu na konštantu, aby ste sa vyhli kopírovaniu (v prípade, že implementácia std :: string nie je Copy-On-Write).
  2. Rezervujte miesto v reťazci std :: zavolaním rezervy.
  3. Vyhnite sa opakovanému volaniu std :: string :: length, hodnotu si zapamätajte.
  4. Nepoužívajte opakovane indexovanie reťazca, namiesto toho použite iterátor.

Za to, čo stojí za to, môžete vyskúšať iný (funkčnejší) spôsob implementácie tejto funkcie. Niekto to môže považovať za idiomatický, iným sa bude čítať ťažšie. Váš hovor - možno len pre zábavu, aby ste videli, aký výkon má (nezabudnite povoliť optimalizáciu!):

vyhnúť sa alokáciám, keď robíte + =.

Tento kód by ste mohli vyskúšať, ale pochybujem, že bude oveľa rýchlejší:

Všimnite si, že parameter in je teraz odovzdaný odkazom. Možným, aj keď nepravdepodobným, zlepšením by bolo vytvorenie vyhľadávacej tabuľky s veľkosťou 256 boolov, ktorá uloží, ak je daný znak alfa:

Upozorňujeme, že LUT sa naplní vždy, keď sa tento kód volá, ak je však reťazec> 20 000, tentoraz by to malo byť nepodstatné.

Môžete vyskúšať nasledujúci kód C ++ 11, ktorý vyhradzuje pamäť a mení výslednú veľkosť reťazca iba raz

Tu je ďalší štandard, ktorý ukazuje ešte ďalšiu možnosť, ktorá by mohla stáť za zváženie, ak môžete:

Aspoň v mojom testovaní, s VC ++ (10) a g ++ (4.7.0), std :: vector vyjde rýchlejšie ako string.

Používanie našej vlastnej verzie isalpha riadenej tabuľkou pomáha dosť rýchlo v porovnaní s používaním :: isalpha, ale použitie std :: vector zvyšuje rýchlosť ešte viac, najmä s VC ++ (aj keď rozdiel je spravodlivo podstatné aj pre g ++).

Pre tých, ktorí radi porovnávajú prekladače, stojí za zmienku, že g ++ je nielen celkovo rýchlejší, ale aj konzistentnejšie rýchly. V prípade g ++ je najhorší prípad len asi dvakrát pomalší ako najrýchlejší. V prípade VC ++ je najhorší prípad asi trikrát pomalší.

Použite miestne nastavenie C. Na niektorých miestach môžu byť izalfa a priatelia veľmi pomalí.

alebo použite std :: locale na aktiváciu C locale z kódu

Príklad toho, ako môžu miestne nastavenia spomaliť výkon napr. Zoradenie UNIX (1) faktorom 20x, pozrite si túto starú odpoveď:

Niekedy je potrebné použiť referenčné hodnoty.

Pravdepodobne bude lepšie optimalizované idiomatické riešenie v C ++, takže riešenia Andrey a Frerich sú silnými uchádzačmi.

Nasledujúci kód poskytuje nasledujúce výsledky s gcc 4.3.2 a -O2:

Vstup 1: "afoiahge m8hfw fewu8 n vn ghwvoiwbegh2390ty3t80ytgh8ghng8hg24u8b vh2vn289vh2gh28g9jfhfuweghwu2hbvgfw22ghb84ty2bgv2nfbukbvsdbvwuivbnbvbnn hf wgwg gwev wgbv23t4 1sv4gbwer14hh414ernhe 01e4g 1e 1h4ghwerh14re e4hj 14yv y344yjd1vh h 1E6"

Input2: vami navrhovaný reťazec

Z Andreyho: 1: 1243, 2: 65469

Z Frerichových: 1: 1965, 2: 140818

Preto Andreyho riešenie ponúka dvojnásobné zrýchlenie oproti navrhovanému riešeniu. Oveľa lepšie.

Ich stratégia sa líši, pretože Andrey skopíruje celú strunu jedným ťahom a potom odstráni časti, ktoré sa nezmestia, zatiaľ čo Frerich skopíruje len tie správne časti, ktoré sa majú začať.

Vybral by som si Frerichov prístup (napriek tomu, že je tu mierne pomalší), len aby som sa vyhol veľkým nepoužívaným kópiám, ak je problémom pamäť. Upozorňujeme, že ak máte tušenie o distribúcii, môžete upraviť množstvo vyhradenej pamäte.

Skúste zavolať rezervu (2000) na svoj posledný reťazec skôr, ako ho použijete. Ako argument tiež vezmite const ref.

Tušil by som, že v systéme Unix vykonáva funkcia isalpha oveľa viac práce na podporu Unicode a zaujíma vás iba rozsah ASCII. Je to stále veľký skok, ale môžete ho skúsiť nahradiť vlastným porovnaním, napríklad if ((v [i] & lt = 'Z' & amp & amp v [i] & gt = 'A') || (v [i] & gt = 'a' & amp & amp v [i] & lt = 'z')).

Navrhujem, že to nie je čas, ktorý volá isalpha (), ale skôr dve hovory std :: string :: operator [] a / alebo std :: string :: operator + = volanie.

Pravdepodobne by ste mohli túto slučku zrýchliť pomocou iterátora, na ktorý sa budete odvolávať, čím sa vyhnete std :: string :: operator [] a pripojenie znaku bude rýchlejšie pomocou std :: string :: push_back a ak pôvodne rozširujete final rovnaká počiatočná kapacita ako v roku 2006.

Môže pomôcť aj odovzdanie nezmeneného vstupného reťazca ako referencie const, ale bude významné iba v prípade, že iteratívne voláte samotnú funkciu.

Všetko, čo ste povedali, dôrazne navrhujem, aby ste na odhalenie skutočného výkonu využili profiler alebo do kódu pridali časovacie prístroje. Načasovanie, ktoré navrhujete, sa nejaví pravdepodobné - myslím, že sa tu deje niečo iné.