Mehr

Python-Skripterstellung für Feature-Classes (Schleifen, Sortieren, Zusammenführen und Ersetzen)


Dies muss ich mit einem Python-Skript für ArcGIS 10.1 erreichen:

  1. Durchlaufen Sie alle Feature-Classes und fügen Sie zuerst ein Feld hinzu, und schreiben Sie dann den Namen der Feature-Class in das hinzugefügte Feld.
  2. Führen Sie alle Feature-Classes von 1. zu einer Feature-Class namens OSRS_ORN_NER zusammen.
  3. Sortieren Sie diese Feature-Class nach HWY_NUM und ersetzen Sie OSRS_ORN_NER durch die sortierte.

Das ist der Code, den ich bisher dafür habe:

Ich denke, der erste Teil des Codes ist richtig, aber ich weiß nicht, ob ich den zweiten richtig gemacht habe oder ob ich beim letzten Teil überhaupt auf dem richtigen Weg bin. Wie genau würde ich ein Python-Skript in ArcGIS ausführen? Jede Hilfe wäre toll!

Code:

import arcpy, os arcpy.env.workspace = r'W:S&Ps&p techsEmilyTownshipsDissolvedFinalDissolved.gdb' # Durchlaufen aufgelöster Feature-Classes, Hinzufügen des Felds 'Name' und Schreiben des #-Feature-Class-Namens in das hinzugefügte Feld . für fc in arcpy.ListFeatureClasses(): arcpy.AddField_management(fc, "Name", "TEXT", field_length = 50) mit arcpy.da.UpdateCursor(fc, "Name") als Cursor: für Zeile im Cursor: row[ 0] = fc cursor.updateRow(row) # Zusammenführen der mehreren Feature-Classes zu einer namens OSRS_ORN_NER list = [] for r in row: list.append(r) arcpy.Merge_management(list, "W:S&Ps&p techs EmilyTownshipsDissolvedFinalDissolved.gdbOSRS_ORN_NER") # Sortierung nach HWY_NUM_PR und Ersetzen von OSRS_ORN_NER durch die sortierte Feature-Class Sort_management("OSRS_ORN_NER", "OSRS_ORN_NER_new", [["HWY_NUM_PR", "ASCENDING"]]

Sie müssen zuerst die zuweisenListFeatureClasses()in eine Variable, damit Sie sie später für die Zusammenführung aufrufen können

import arcpy, os arcpy.env.workspace = r'W:S&Ps&p techsEmilyTownshipsDissolvedFinalDissolved.gdb' fcs = arcpy.ListFeatureClasses() für fc in fcs: arcpy.AddField_management(fc, "Name", "TEXT", field_length = 50) mit arcpy.da.UpdateCursor(fc, "Name") als Cursor: für Zeile im Cursor: row[0] = fc cursor.updateRow(row) mergeOutput = r"W:S&P s&p techsEmilyTownshipsDissolvedFinalDissolved.gdbOSRS_ORN_NER" sortOutput = r"W:S&Ps&p techsEmilyTownshipsDissolvedFinalDissolved.gdbOSRS_ORN_NER_new" , [["HWY_NUM_PR", "ASCENDING"]])

es sieht ganz in Ordnung aus, aber Sie sollten Ihre Liste initialisieren, bevor Sie die fc-Schleife durchlaufen, und die fc-Namen korrekt an Ihre Liste anhängen

für fc in arcpy.ListFeatureClasses(): list.append(fc)… arcpy.Merge_management(list,outputname) arcpy.Sort_management(outputname, finalname, [["HWY_NUM_PR", "ASCENDING"]])

Wie kann ich feststellen, wo mein Python-Skript hängt?

Also debugge ich mein Python-Programm und bin auf einen Fehler gestoßen, der das Programm wie in einer Endlosschleife hängen lässt. Nun, ich hatte vorher ein Problem mit einer Endlosschleife, aber als es auflegte, konnte ich das Programm beenden und Python spuckte eine hilfreiche Ausnahme aus, die mir sagte, wo das Programm beendet wurde, als ich ihm den Kill-Befehl schickte. Wenn das Programm jetzt auflegt und ich es mit Strg-C drücke, bricht es jedoch nicht ab, sondern läuft weiter. Gibt es ein Tool, mit dem ich das Aufhängen lokalisieren kann? Ich bin neu in der Profilerstellung, aber soweit ich weiß, kann ein Profiler Ihnen nur Informationen über ein erfolgreich abgeschlossenes Programm geben. Oder können Sie einen Profiler verwenden, um solche Hänger zu debuggen?


Was nennen wir Web-Scraping?

Web Scraping ist ein automatisierter Prozess zum Sammeln öffentlicher Daten. Web Scraper extrahieren innerhalb von Sekunden automatisch große Mengen öffentlicher Daten von Zielwebsites.

Dieses Python-Web-Scraping-Tutorial funktioniert für alle Betriebssysteme. Es wird leichte Unterschiede geben, wenn Sie entweder Python oder Entwicklungsumgebungen installieren, aber nicht in anderen Bereichen.

  • Erstellen eines Web Scrapers: Python-Vorbereitung
  • Anfahrt zu den Bibliotheken
  • WebTreiber und Browser
  • Einen gemütlichen Platz für unseren Python Web Scraper finden
  • Importieren und Verwenden von Bibliotheken
  • Eine URL auswählen
  • Definieren von Objekten und Gebäudelisten
  • Extrahieren von Daten mit unserem Python Web Scraper
  • Exportieren der Daten
  • Weitere Listen. Mehr!
  • Web-Scraping mit Python Best Practices
  • Fazit

Welche Abschnitte von Python sollte ich für ArcGis lernen?

Ich möchte Python für ArcGis lernen. Ich habe "Automatisieren Sie die langweiligen Sachen mit Python gekauft." Es ist ein lustiges Buch, aber es ist groß! Auf welche Abschnitte/Code sollte ich mich beim Erlernen von Python für ArcGis konzentrieren? Soll ich mich beispielsweise auf die Schleife "while" usw. konzentrieren? Vielen Dank!

Sie sollten das ganze Buch durcharbeiten. Es dauert überhaupt nicht lange. Hier habe ich angefangen und das Ganze wird Ihnen eine gute Grundlage geben, bevor Sie mit Python für GIS beginnen.

Ist das ein Buch, das Sie mir empfehlen? Ich habe schon früher mit R gearbeitet, weiß, wie man einige grundlegende Abfrageaktionen durchführt :p und das wars.

Ja, in den Kursen, die ich belegte, gingen wir buchstäblich die gesamte Toolbox-Liste durch und konzentrierten uns mehr auf die obskuren Verarbeitungsfunktionen, die sowieso in Python ausgeführt werden sollten.

Auch das Auffrischen von Programmiertheorie und -problemen ist großartig. Ich hatte keine Ahnung von den Problemen in der Programmierung (wie das Debuggen all der verschiedenen Fehlertypen), bis ich einen Comp sci-Kurs belegte.

Viele der GIS-Funktionen (wie das Ausführen von Geoverarbeitungswerkzeugen), die Sie mit arcpy benötigen, sind ziemlich esri-spezifisch. Wenn Sie also Nicht-GIS-Python lernen, ist es hauptsächlich ein grundlegendes Verständnis der Struktur eines Skripts (Festlegen von Variablen, Syntax, Importieren von Bibliotheken usw.) und das Erlernen von Wiederholungen, z. B. Schleifen durch einen Ordner mit Dateien.

Trennen Sie sich so schnell wie möglich von arcpy. Es gibt eine riesige Welt an Tools und Optionen da draußen.

Ich denke, "die Grundlagen" sind die Kapitel 1-10. Aber danach würde ich weitermachen. Das ganze Buch ist gut.

Datentypen sind wichtig und Methoden zu deren Überprüfung und Zusammenfassung.

Zip um über mehrere Elemente gleichzeitig zu iterieren

Listenverständnis speziell zum Erstellen von benutzerdefinierten Zeichenfolgen

Dann finden Sie heraus, wie nützlich die Arcgis-Dokumentation jetzt mit arcpy ist

Dann googeln Sie Ihr Problem mit site:stackexchange.com, um Beispiele, Erklärungen und Randnotizen zu Ihrem Problem zu erhalten, und lernen Sie.

Verwenden Sie Ihren Code wieder. Speichern Sie eine Version, bevor Sie wesentliche Änderungen vornehmen.

Sobald alles in Ordnung ist, können Sie sich Conda-Umgebungen oder virtuelle Umgebungen ansehen, um sehr interessante Analysen, statistisches Lernen, Grafiken und datentransformierende Bibliotheken einzuführen.

Inklusive Jupyter Notebook, das auch Anfängern einfaches Code-Testen und Selbstdokumentation ermöglicht.

Zu jeder Zeit auf dem Weg oder nachdem Sie Zeit und Interesse haben, lesen und arbeiten Sie ein Buch so weit wie möglich durch. Ich empfehle Learning Python von OReilly Press.


Python ist eine der vielen Open-Source-Anwendungssoftwares für objektorientierte Programmierung, die auf dem Markt erhältlich sind. Einige der vielen Verwendungen von Python sind Anwendungsentwicklung, Implementierung von Automatisierungstestprozessen, ermöglicht mehrere Programmierungsbuilds, vollständig aufgebaute Programmierbibliothek, kann in allen wichtigen Betriebssystemen und Plattformen verwendet werden, Zugänglichkeit des Datenbanksystems, einfacher und lesbarer Code, einfach zu verwenden Anwendung auf komplexe Softwareentwicklungsprozesse, Unterstützung beim testgetriebenen Ansatz der Softwareanwendungsentwicklung, maschinelles Lernen/Datenanalyse, hilft bei der Mustererkennung, unterstützt in mehreren Tools, ermöglicht durch viele der bereitgestellten Frameworks usw.

10 wichtige Anwendungen von Python

Python kann aufgrund seiner Vorteile benutzerfreundlicher sein. Nachfolgend finden Sie die Verwendungen der Python-Sprache aus verschiedenen Gründen:

Webentwicklung, Programmiersprachen, Softwaretests und andere

1. Bewerbungen

Python kann verwendet werden, um verschiedene Anwendungen wie Webanwendungen, grafische Benutzeroberflächenanwendungen, Softwareentwicklungsanwendungen, wissenschaftliche und numerische Anwendungen, Netzwerkprogrammierung, Spiele und 3D-Anwendungen und andere Geschäftsanwendungen zu entwickeln. Es macht eine interaktive Schnittstelle und eine einfache Entwicklung von Anwendungen.

2. Mehrere Programmierparadigmen

Es wird auch verwendet, weil es mehrere Programmierparadigmen kontinuierlich unterstützt, da es objektorientierte Programmierung und strukturierte Programmierung unterstützt. Python verfügt über Funktionen, die auch verschiedene Konzepte der funktionalen Programmiersprache unterstützen. Es wird für dynamisches Typsystem und automatische Speicherverwaltung verwendet. Mit Python-Sprachfunktionen und Programmierparadigmen können Sie sowohl kleine als auch große Anwendungen entwickeln. Es kann für komplexe Softwareanwendungen verwendet werden.

3. Robuste Standardbibliothek

Es verfügt über eine große und robuste Standardbibliothek für die Entwicklung von Anwendungen. Es bringt die Entwickler auch dazu, Python gegenüber anderen Sprachen zu verwenden. Die Standardbibliothek hilft Ihnen, die verschiedenen für Python verfügbaren Module zu verwenden, da dieses Modul Ihnen hilft, die Funktionalität hinzuzufügen, ohne weiteren Code zu schreiben. Um Informationen zu verschiedenen Modulen zu erhalten, kann auf die Dokumentation zur Python-Standardbibliothek verwiesen werden. Bei der Entwicklung einer Webanwendung, der Implementierung von Webdiensten, der Durchführung von String-Operationen und anderen Anwendungen wie dem Schnittstellenprotokoll hilft die Standardbibliotheksdokumentation.

4. Kompatibel mit den wichtigsten Plattformen und Systemen

Es ist hauptsächlich mit den wichtigsten Plattformen und Systemen kompatibel, weshalb es hauptsächlich für die Entwicklung von Anwendungen verwendet wird. Mithilfe von Python-Interpretern kann Python-Code auf bestimmten Plattformen und Tools ausgeführt werden, da er viele Betriebssysteme unterstützt. Da Python eine interpretierte höhere Programmiersprache ist und Sie den Code auf mehreren Plattformen ausführen können. Der neue und geänderte Code kann ohne Neukompilierung ausgeführt und seine Auswirkungen überwacht oder überprüft werden. Das bedeutet, dass der Code nicht nach jeder Änderung neu kompiliert werden muss. Diese Funktion hilft, die Entwicklungszeit der Entwickler zu sparen.

5. Zugriff auf die Datenbank

Die Verwendung von Python hilft auch beim einfachen Zugriff auf die Datenbank. Python hilft bei der Anpassung der Schnittstellen verschiedener Datenbanken wie MySQL, Oracle, Microsoft SQL Server, PostgreSQL und anderer Datenbanken. Es hat eine Objektdatenbank wie Durus und ZODB. Es wird für die Standard-Datenbank-API verwendet und steht kostenlos zum Download zur Verfügung.

6. Lesbarkeit des Codes

Python-Code ist einfach zu lesen und zu warten. Es ist leicht wiederverwendbar, wo immer es benötigt wird. Python hat eine einfache Syntax, die es ermöglicht, die verschiedenen Konzepte zu entwickeln, ohne zusätzlichen Code zu schreiben. Der Code sollte von guter Qualität und der Quellcode leicht zu warten sein und die Wartung, die zur Entwicklung der Softwareanwendung erforderlich ist, vereinfachen. Es betont auch die Lesbarkeit des Codes, was im Gegensatz zu anderen Programmiersprachen ein großartiges Feature ist. Es hilft beim Erstellen benutzerdefinierter Anwendungen, und sauberer Code hilft bei der Wartung und Aktualisierung der Softwareanwendungen, ohne zusätzlichen Aufwand in denselben Code zu stecken.

7. Vereinfachen Sie die komplexe Softwareentwicklung

Python-Anwendungen werden verwendet, um den komplexen Softwareentwicklungsprozess zu vereinfachen, da es sich um eine universelle Programmiersprache handelt. Es wird für die Entwicklung komplexer Anwendungen wie wissenschaftliche und numerische Anwendungen sowie für Desktop- und Webanwendungen verwendet. Python verfügt über Funktionen wie das Analysieren von Daten und die Visualisierung, die bei der Erstellung benutzerdefinierter Lösungen ohne zusätzlichen Aufwand und Zeitaufwand helfen. Es hilft Ihnen, Daten effektiv zu visualisieren und zu präsentieren.

8. Viele Open Source Frameworks und Tools

Python ist Open Source und leicht verfügbar. Dies hilft auch bei der Kostenkalkulation für die Softwareentwicklung erheblich. Es gibt viele Open-Source-Anwendungen von Python-Frameworks, Bibliotheken und Entwicklungswerkzeugen, um die Anwendung ohne zusätzliche Kosten zu entwickeln. Python-Frameworks vereinfachen und beschleunigen den Prozess für die Entwicklung von Webanwendungen, und die Frameworks sind Django, Flask, Pyramid usw. Python-GUI-Frameworks sind für die Entwicklung der GUI-basierten Anwendung verfügbar.

9. Übernehmen Sie testgetriebene Entwicklung

Python erleichtert das Codieren sowie das Testen mit Hilfe des Test Driven Development-Ansatzes. Die Testfälle können vor jeder Codeentwicklung einfach geschrieben werden. Wann immer die Codeentwicklung gestartet wurde, können die geschriebenen Testfälle gleichzeitig mit dem Testen des Codes beginnen und das Ergebnis liefern. Diese können auch zum Prüfen oder Testen der Vorbedingungen anhand des Quellcodes verwendet werden.

10. Andere Anwendungen, für die Python verwendet wird

Es gibt andere Anwendungen, für die Python verwendet wird: Robotik, Web-Scraping, Skripting, künstliche Intelligenz, Datenanalyse, maschinelles Lernen, Gesichtserkennung, Farberkennung, 3D-CAD-Anwendungen, konsolenbasierte Anwendungen, audiobasierte Anwendungen, videobasiert Anwendungen, Unternehmensanwendungen und Anwendungen für Bilder usw. Dies sind einige der wichtigsten verwendeten Anwendungen.

Fazit

In diesem Artikel über die Verwendung von Python haben wir gesehen, dass Python eine der wichtigsten Sprachen ist, die verwendet wird, um sowohl Desktop- als auch Webanwendungen zu entwickeln. Python verfügt über Funktionen, die allgemeine Programmieraufgaben übernehmen. Python ist einfach zu erlernen und einfach zu bedienen. Manchmal wird Python als langsamer markiert als andere weit verbreitete Programmiersprachen wie Java. Python-Anwendungen können beschleunigt werden, indem einfach der Code gewartet und eine benutzerdefinierte Laufzeit verwendet wird.

Python unterstützt die Module und Pakete, was die Modularität des Programms und die Wiederverwendung von Code fördert. Python bietet eine Steigerung der Produktivität, was es zur ersten Wahl von Entwicklern macht. Es hat eine großartige Lernkurve, da es funktionale und prozedurale Programmiersprachen unterstützt. Es ist Open Source und kann frei verteilt werden. Die Programmiersprache wurde hauptsächlich aufgrund der Anforderung und der Kompatibilität mit Plattformen und Datenbanken ausgewählt.

Empfohlene Artikel

Dies war ein Leitfaden für die Verwendung der Python-Sprache. Hier haben wir die verschiedenen Verwendungen von Python wie den einfachen Zugriff auf die Datenbank, die Softwareentwicklung, die Codezuverlässigkeit und die robuste Standardbibliothek im Detail besprochen. Sie können sich auch die folgenden Artikel ansehen, um mehr zu erfahren –


5. Mehrere Ersetzungsoperationen: Ersetzen Sie mehrere Muster durch dieselbe Zeichenfolge

Ersetzen Sie foo , bar oder baz durch foobar

Ein gutes Ersatz-Linux-Tool ist rpl, das ursprünglich für das Debian-Projekt geschrieben wurde, daher ist es mit apt-get install rpl in jeder von Debian abgeleiteten Distribution verfügbar und kann für andere sein, aber ansonsten können Sie die Datei tar.gz von SourceForge herunterladen.

Beachten Sie, dass die Zeichenfolge, wenn sie Leerzeichen enthält, in Anführungszeichen eingeschlossen werden sollte. Standardmäßig kümmert sich rpl um Großbuchstaben aber nicht von komplette Wörter, aber Sie können diese Standardeinstellungen mit den Optionen -i (Groß-/Kleinschreibung ignorieren) und -w (ganze Wörter) ändern. Sie können auch angeben mehrere Dateien:

Oder spezifizieren Sie sogar die Erweiterungen ( -x ) um zu suchen oder sogar zu suchen rekursiv ( -R ) im Verzeichnis:

Sie können auch suchen/ersetzen in interaktiver Modus mit Option -p (Eingabeaufforderung):

Die Ausgabe zeigt die Anzahl der ersetzten Dateien/Strings und die Art der Suche (Groß-/Kleinschreibung beachten, ganze/teilweise Wörter), kann aber mit -q (Ruhemodus) Option oder noch ausführlicher, indem sie Zeilennummern auflistet, die Übereinstimmungen jeder Datei und jedes Verzeichnisses mit -v (ausführlicher Modus) Möglichkeit.

Andere Optionen, an die man sich erinnern sollte, sind -e (Ehre escapes), die reguläre Ausdrücke zulassen, sodass Sie auch Tabulatoren ( ), neue Zeilen ( ) usw. durchsuchen können. Sie können -f verwenden, um Berechtigungen erzwingen (natürlich nur wenn der Benutzer Schreibrechte hat) und -d um die Änderungszeiten zu erhalten`).

Schließlich, wenn Sie sich nicht sicher sind, was genau passieren wird, verwenden Sie -s (Simulationsmodus).


Ein volles Programm: Asynchrone Anfragen

Sie haben es bis hierher geschafft und jetzt ist es Zeit für den spaßigen und schmerzlosen Teil. In diesem Abschnitt erstellen Sie einen Web-Scraping-URL-Collector, areq.py , mit aiohttp , einem blitzschnellen asynchronen HTTP-Client/Server-Framework. (Wir brauchen nur den Client-Teil.) Ein solches Tool könnte verwendet werden, um Verbindungen zwischen einem Cluster von Sites abzubilden, wobei die Links einen gerichteten Graphen bilden.

Hinweis: Sie fragen sich vielleicht, warum Python&rsquos-Anforderungspaket nicht mit asynchroner E/A kompatibel ist. request baut auf urllib3 auf, das wiederum Python&rsquos http- und Socket-Module verwendet.

Standardmäßig werden Socketvorgänge blockiert. Dies bedeutet, dass Python wie await request.get(url) gewonnen hat, weil .get() nicht abwartebar ist. Im Gegensatz dazu ist fast alles in aiohttp eine abwartbare Coroutine, wie beispielsweise session.request() und response.text() . Ansonsten ist es ein großartiges Paket, aber Sie tun sich selbst keinen Gefallen, indem Sie Anfragen in asynchronem Code verwenden.

Die Programmstruktur auf hoher Ebene sieht wie folgt aus:

Lesen Sie eine Sequenz von URLs aus einer lokalen Datei, urls.txt .

Senden Sie GET-Anfragen für die URLs und decodieren Sie den resultierenden Inhalt. Wenn dies fehlschlägt, stoppen Sie dort für eine URL.

Suchen Sie im HTML-Code der Antworten nach den URLs innerhalb der href-Tags.

Schreiben Sie die Ergebnisse in foundurls.txt .

Führen Sie alle oben genannten Schritte so asynchron und gleichzeitig wie möglich aus. (Verwenden Sie aiohttp für die Anforderungen und aiofiles für die Dateianhänge. Dies sind zwei Hauptbeispiele für E/A, die sich gut für das asynchrone E/A-Modell eignen.)

Hier ist der Inhalt von urls.txt . Es ist nicht riesig und enthält hauptsächlich Websites mit hohem Traffic:

Die zweite URL in der Liste sollte eine 404-Antwort zurückgeben, die Sie ordnungsgemäß verarbeiten müssen. Wenn Sie eine erweiterte Version dieses Programms ausführen, müssen Sie sich wahrscheinlich mit viel komplizierteren Problemen auseinandersetzen, wie z. B. Serverabbrüchen und endlosen Umleitungen.

Die Anforderungen selbst sollten über eine einzelne Sitzung erfolgen, um die Wiederverwendung des internen Verbindungspools der Sitzung zu nutzen.

Werfen Sie einen Blick auf das vollständige Programm. Wir gehen die Dinge Schritt für Schritt durch, nachdem:

Dieses Skript ist länger als unsere anfänglichen Spielzeugprogramme, also lassen Sie es uns aufschlüsseln.

Die Konstante HREF_RE ist ein regulärer Ausdruck, um das zu extrahieren, wonach wir letztendlich suchen, href-Tags in HTML:

Die Coroutine fetch_html() ist ein Wrapper um eine GET-Anfrage, um die Anfrage zu stellen und den resultierenden Seiten-HTML zu decodieren. Es stellt die Anfrage, wartet auf die Antwort und meldet sich sofort bei einem Nicht-200-Status:

Wenn der Status in Ordnung ist, gibt fetch_html() den Seiten-HTML (a str ) zurück. Bemerkenswert ist, dass in dieser Funktion keine Ausnahmebehandlung durchgeführt wird. Die Logik besteht darin, diese Ausnahme an den Aufrufer weiterzugeben und sie dort behandeln zu lassen:

Wir erwarten session.request() und resp.text(), weil sie abwartbare Coroutinen sind. Der Anfrage-/Antwort-Zyklus wäre ansonsten der langwierige, zeitraubende Teil der Anwendung, aber mit async IO lässt fetch_html() die Ereignisschleife für andere leicht verfügbare Jobs wie das Parsen und Schreiben von bereits abgerufenen URLs arbeiten .

Als nächstes in der Kette von Coroutinen kommt parse() , das auf fetch_html() auf eine bestimmte URL wartet und dann alle href-Tags aus dem HTML-Code dieser Seite extrahiert, um sicherzustellen, dass jedes gültig ist, und als absoluten Pfad formatiert.

Zugegeben, der zweite Teil von parse() blockiert, aber er besteht aus einem schnellen Regex-Match und stellt sicher, dass die gefundenen Links in absolute Pfade umgewandelt werden.

In diesem speziellen Fall sollte dieser synchrone Code schnell und unauffällig sein. Aber denken Sie daran, dass jede Zeile innerhalb einer gegebenen Coroutine andere Coroutinen blockiert, es sei denn, diese Zeile verwendet yield, await oder return. Wenn das Parsen ein intensiverer Prozess war, sollten Sie diesen Teil in einem eigenen Prozess mit loop.run_in_executor() ausführen.

Als nächstes nimmt die Coroutine write() ein Dateiobjekt und eine einzelne URL und wartet auf parse(), um einen Satz der geparsten URLs zurückzugeben, wobei jede asynchron zusammen mit ihrer Quell-URL in die Datei geschrieben wird, indem aiofiles verwendet wird, ein Paket für asynchrone Datei IO.

Schließlich dient Bulk_crawl_and_write() als Haupteinstiegspunkt in die Coroutinen-Kette des Skripts. Es verwendet eine einzelne Sitzung, und für jede URL, die letztendlich aus urls.txt gelesen wird, wird eine Aufgabe erstellt.

Hier noch einige zusätzliche Punkte, die es zu erwähnen gilt:

Die Standard-ClientSession verfügt über einen Adapter mit maximal 100 offenen Verbindungen. Um dies zu ändern, übergeben Sie eine Instanz von asyncio.connector.TCPConnector an ClientSession . Sie können auch Grenzwerte pro Host festlegen.

Sie können maximale Zeitüberschreitungen sowohl für die gesamte Sitzung als auch für einzelne Anfragen festlegen.

Dieses Skript verwendet auch async mit , das mit einem asynchronen Kontext-Manager funktioniert. Ich habe diesem Konzept einen ganzen Abschnitt gewidmet, da der Übergang von synchronen zu asynchronen Kontextmanagern ziemlich einfach ist. Letzteres muss .__aenter__() und .__aexit__() statt .__exit__() und .__enter__() definieren. Wie Sie vielleicht erwarten, kann async with nur innerhalb einer mit async def deklarierten Coroutine-Funktion verwendet werden.

Wenn Sie etwas mehr erkunden möchten, sind den Begleitdateien für dieses Tutorial auf GitHub auch Kommentare und Docstrings angehängt.

Hier ist die Ausführung in ihrer ganzen Pracht, da areq.py die Ergebnisse für 9 URLs in weniger als einer Sekunde abruft, analysiert und speichert:

Das ist nicht zu schäbig! Als Plausibilitätsprüfung können Sie die Zeilenanzahl in der Ausgabe überprüfen. In meinem Fall ist es 626, aber denken Sie daran, dass dies schwanken kann:

Nächste Schritte: Wenn Sie den Einsatz erhöhen möchten, machen Sie diesen Webcrawler rekursiv. Sie können aio-redis verwenden, um zu verfolgen, welche URLs innerhalb des Baums gecrawlt wurden, um eine doppelte Anforderung zu vermeiden, und Links mit Python&rsquos networkx-Bibliothek verbinden.

Denken Sie daran, nett zu sein. Das Senden von 1000 gleichzeitigen Anfragen an eine kleine, ahnungslose Website ist schlecht, schlecht, schlecht. Es gibt Möglichkeiten, die Anzahl der gleichzeitigen Anforderungen zu begrenzen, die Sie in einem Batch stellen, z. B. durch die Verwendung der sempahore-Objekte von asyncio oder durch die Verwendung eines Musters wie dieses. Wenn Sie diese Warnung nicht beachten, erhalten Sie möglicherweise eine riesige Menge von TimeoutError-Ausnahmen und verletzen am Ende nur Ihr eigenes Programm.


1 Antwort 1

Danke, dass du deinen Code geteilt hast!

Ich werde nicht alle Ihre Fragen behandeln, aber ich werde mein Bestes geben.

(Warnung, langer Post eingehend)

Stimmt meine Implementierung? (Die Tests sagen es)

Soweit ich versucht habe, es zu brechen, würde ich sagen, ja, es ist richtig. Aber siehe unten für gründlichere Testmethoden.

Kann es beschleunigt werden?

Als erstes habe ich das Profil Ihrer Testdatei (ich habe sie test_heap.py genannt) leicht geändert, um die Zufallslistengenerierung zu starten. Ich habe auch den Aufruf random.sample geändert, um mit dem Parameter sample_size flexibler zu sein.

Die Population von random.sample ist also immer größer als meine sample_size . Gibt es vielleicht einen besseren Weg?

Ich habe auch die Stichprobengröße auf 50000 festgelegt, um eine angemessene Größe für den nächsten Schritt zu haben.

Der nächste Schritt war Profilierung der Code mit python -m cProfile -s cumtime test_heap.py . Wenn Sie mit dem Profiler nicht vertraut sind, lesen Sie das Dokument. Ich starte den Befehl ein paar Mal, um die Variationen im Timing zu verstehen, was mir eine Grundlage für die Optimierung gibt. Der ursprüngliche Wert war:

Jetzt haben wir ein Ziel, das es zu schlagen gilt, und ein paar Informationen, was Zeit braucht. Ich habe nicht die gesamte Liste der Funktionsaufrufe eingefügt, sie ist ziemlich lang, aber Sie bekommen die Idee.

In _siftdown wird viel Zeit verbracht und viel weniger in _siftup , und einige Funktionen werden oft aufgerufen, also schauen wir mal, ob wir das beheben können.

(Ich hätte mit _siftdown beginnen sollen, was der große Fisch hier war, aber aus irgendeinem Grund habe ich mit _siftup angefangen, verzeih mir)

Beschleunigung von _siftup

Ich habe die Methode zur Berechnung von parent_index geändert, weil ich mir die Quelle des Heapq-Moduls angesehen habe und sie es verwenden. (siehe hier), aber ich konnte den Unterschied im Timing allein aufgrund dieser Änderung nicht sehen.

Dann habe ich den Aufruf von _get_parent entfernt und die entsprechende Änderung vorgenommen (eine Art Inlining, da Funktionsaufrufe in Python nicht billig sind) und die neue Zeit ist

Funktionsaufrufe gingen offensichtlich zurück, aber die Zeit sank nur um 70-80 Millisekunden. Kein großer Sieg (etwas weniger als 3% Beschleunigung). Und die Lesbarkeit wurde nicht so verbessert, ob es sich lohnt.

Beschleunigung von _siftdown

Die erste Änderung bestand darin, die Lesbarkeit zu verbessern.

Ich habe die ternäre Zuweisung transformiert

Ich finde es viel lesbarer, aber es ist wahrscheinlich Geschmackssache. Und als ich den Code erneut profilierte, war das Ergebnis zu meiner Überraschung:

(Ich habe es 10 Mal laufen lassen und hatte immer etwa 80-100 Millisekunden gewonnen). Ich verstehe nicht wirklich warum, wenn mir das jemand erklären könnte?

Wie in _siftup habe ich 2 Aufrufe von den Hilfsfunktionen _get_left_child und _get_right_child inlineed und das hat sich ausgezahlt!

Das ist eine Beschleunigung von 30 % gegenüber dem Ausgangswert.

(Was folgt, ist eine weitere Optimierung, die ich zu erklären versuche, aber ich habe den Code verloren, den ich dafür geschrieben habe. Ich werde es später noch einmal versuchen. Es könnte Ihnen eine Vorstellung von dem Gewinn geben)

Wenn wir dann den heapq-Trick verwenden, um den Vergleich für max und min zu spezialisieren (mit einer _siftdown_max- und _siftup_max-Version, die den Comparer durch > ersetzt und dasselbe für min macht), können wir:

Ich bin bei den Optimierungen nicht weitergekommen, aber der _siftdown ist immer noch ein großer Fisch, also gibt es vielleicht noch Raum für weitere Optimierungen? Und Pop und Push könnten vielleicht ein bisschen überarbeitet werden, aber ich weiß nicht wie.

Wenn ich meinen Code mit dem im heapq-Modul vergleiche, scheint es, dass sie keine heapq-Klasse bereitstellen, sondern nur eine Reihe von Operationen, die mit Listen arbeiten? Ist das besser?

Viele Implementierungen, die ich gesehen habe, durchlaufen die Elemente mit einer while-Schleife in der Methode sifdown, um zu sehen, ob sie das Ende erreicht. Stattdessen rufe ich das ausgewählte Kind erneut auf. Ist dieser Ansatz besser oder schlechter?

Da Funktionsaufrufe teuer sind, könnten Schleifen anstelle von Rekursionen schneller sein. Aber ich finde es besser ausgedrückt als Rekursion.

Ist mein Code sauber und lesbar?

Größtenteils ja! Schöner Code, Sie haben Docstrings für Ihre öffentlichen Methoden, Sie respektieren PEP8, alles ist gut. Vielleicht könnten Sie auch eine Dokumentation für die private Methode hinzufügen? Besonders für harte Sachen wie _siftdown und _siftup .

die ternäre die ich in _siftdown geändert habe halte ich persönlich für sehr schwer zu lesen.

Comparer scheint ein französischer Name zu sein, warum nicht vergleichen? Entweder habe ich etwas übersehen oder du hast die Sprache gemischt und du solltest es nicht tun.

Reicht mein Test (zB für ein Vorstellungsgespräch)?

Ich würde nein sagen. Verwenden Sie ein Modul, um Komponententests durchzuführen. Ich persönlich mag pytest.

Sie stellen dem Namen Ihrer Testdatei test_ voran und dann wird Ihren Testmethoden test_ / _test vorangestellt/angehängt. Dann führen Sie einfach pytest auf der Befehlszeile aus und es erkennt Tests automatisch, führt sie aus und gibt Ihnen einen Bericht. Ich empfehle Ihnen, es zu versuchen.

Ein weiteres großartiges Werkzeug, das Sie hätten verwenden können, ist die Hypothese, die eigenschaftsbasierte Tests durchführt. Es funktioniert gut mit pytest.

Es bietet so ziemlich die gleiche Art von Tests, die Sie in Ihrem automatic_test durchgeführt haben, aber es werden einige coole Funktionen hinzugefügt und es ist kürzer zu schreiben.

Raymond Hettinger hat einen wirklich coolen Vortrag über Tools gehalten, die man beim Testen mit einem kurzen Zeitbudget verwenden kann. Er erwähnt sowohl pytest als auch hypothesis, schau es dir an :)

Ist die Verwendung der Unterklassen MinHeap und MaxHeap & ihre Vergleichsmethode, die sie unterscheidet, ein guter Ansatz, um beide Arten von Heaps bereitzustellen?

Ich glaube, es ist! Aber aus Geschwindigkeitsgründen sollten Sie stattdessen siftdown und siftup in den Unterklassen neu deklarieren und die Instanz von Compare(a,b) durch a < b oder a > b im Code ersetzen.

Das Letzte ist eine Bemerkung, auf Wikipedia heißt es in dem Artikel:

sift-up: Verschiebt einen Knoten im Baum nach oben, so lange wie nötig, um den Heap-Zustand nach dem Einfügen wiederherzustellen. Wird als "sift" bezeichnet, weil der Knoten sich im Baum nach oben bewegt, bis er die richtige Ebene erreicht, wie in einem Sieb.

sift-down: Verschiebt einen Knoten in der Baumstruktur nach unten, ähnlich wie bei sift-up, mit dem der Heap-Zustand nach dem Löschen oder Ersetzen wiederhergestellt wird.

Und ich denke, Sie haben es in diesem Zusammenhang verwendet, aber bei der Implementierung des Heapq-Moduls scheint der Name rückwärts zu sein?

Sie verwenden Siftup in Pop und Siftdown in Push, während Wikipedia uns sagt, dass wir das Gegenteil tun sollen. Kann das bitte jemand erklären?


Doppelter Metaphon-Algorithmus

Das Prinzip des Algorithmus geht auf das letzte Jahrhundert zurück, eigentlich auf das Jahr 1918 (als der erste Computer noch Jahre entfernt war).

Als Nebeninformation (sollten Sie jemals an einer Millionärs-Quizshow teilnehmen), war der erste Computer 23 Jahre entfernt

Der Z3 war ein deutscher elektromechanischer Computer, der von Konrad Zuse entwickelt wurde. Es war der weltweit erste funktionierende programmierbare, vollautomatische Digitalcomputer. Der Z3 wurde mit 2.600 Relais gebaut, die eine 22-Bit-Wortlänge implementierten, die mit einer Taktfrequenz von etwa 4–5 Hz betrieben wurde. Programmcode wurde auf gestanzter Folie gespeichert. Anfangswerte wurden manuell eingegeben (Wikipedia)

Zurück ins Jahr 1918 erfand Robert C. Russell vom US Census Bureau in diesem Jahr den Soundex-Algorithmus, der in der Lage ist, die englische Sprache so zu indizieren, dass mehrere Schreibweisen desselben Namens mit nur einem flüchtigen Blick gefunden werden konnten.

Einwanderer in die Vereinigten Staaten hatten eine Muttersprache, die nicht auf römischen Schriftzeichen basierte. Um ihre Namen, die Namen ihrer Verwandten oder die Städte, aus denen sie kamen, zu schreiben, mussten die Einwanderer nach bestem Wissen und Gewissen erraten, wie sie ihre Symbolsprache auf Englisch ausdrücken sollten. Die Regierung der Vereinigten Staaten erkannte die Notwendigkeit, die Namen von Privatpersonen so kategorisieren zu können, dass mehrere Schreibweisen desselben Namens (z. B. Smith und Smythe) gruppiert werden können. (lesen Sie hier die ganze Geschichte)

Der Soundex-Algorithmus basiert auf einer phonetischen Kategorisierung von Buchstaben des Alphabets. In seinem Patent beschreibt Russell die Strategie, jeder Kategorie einen numerischen Wert zuzuweisen. Johnson wurde beispielsweise auf J525 abgebildet, Miller auf M460 usw.

Der Soundex-Algorithmus hat sich im Laufe der Zeit im Hinblick auf Effizienz und Genauigkeit weiterentwickelt und wurde durch andere Algorithmen ersetzt.

Zum größten Teil wurden sie alle durch das leistungsstarke Indexierungssystem namens Double Metaphone ersetzt. Der Algorithmus ist als Open Source verfügbar und seine letzte Version wurde um 2009 veröffentlicht.

Zum Glück gibt es eine Python-Bibliothek, die wir in unserem Programm verwenden. Wir schreiben einige kleine Wrapper-Methoden um den Algorithmus und implementieren eine Vergleichsmethode.

Das Doppelmetaphon -Methode gibt ein Tupel aus zwei Zeichen key zurück, das eine phonetische Übersetzung des übergebenen Wortes ist. Unsere vergleichen Sie Methode zeigt die Ranking-Fähigkeit des Algorithmus, die ziemlich begrenzt ist.

Lassen Sie uns einige Verifikationsprüfungen durchführen, um die Effizienz des Algorithmus zu bewerten, indem wir die test_class.py die auf Python basiert pytest Rahmen.

Das pytest-Framework macht es einfach, kleine Tests zu schreiben, ist jedoch skalierbar, um komplexe Funktionstests für Anwendungen und Bibliotheken zu unterstützen. (Verknüpfung)

Die Verwendung ist unkompliziert und Sie können die Implementierung der Testklasse unten sehen

Die Testergebnisse sind unten gezeigt. Wir verwendeten zwei Namen (A+B) und überprüften mit einigen geänderten Namen (A1/A2+B1/B2/B3) die Effizienz des Algorithmus.

  • A1+B1 hat den Strong Match Check bestanden. Fehlende Leerzeichen und ü/ä-Ersetzungen durch u/a scheinen sich also nicht auf die doppelte Metaphon-Schlüsselgenerierung auszuwirken
  • B2 besteht das normale Spiel. Auch Rechtschreibfehler werden vom Algorithmus abgedeckt
  • A2 + B3 versagen. A2 verwendet eine Abkürzung eines Namensteils, die nicht zu bewältigen ist. Mit diesem Verhalten mussten wir rechnen und beschlossen, den Namenserweiterungsalgorithmus einzuführen (siehe oben). B3 fehlgeschlagen wegen fehlendem „-“. Dies war unerwartet, aber wir behandeln dieses Verhalten mit einem zweiten Bereinigungsschritt für den Namen.

Listenverständnis (optional)

Listenverständnis ist eine fortgeschrittenere Funktion, die für einige Fälle nützlich ist, aber nicht für die Übungen benötigt wird und die Sie nicht zuerst lernen müssen (d. h. Sie können diesen Abschnitt überspringen). Ein Listenverständnis ist eine kompakte Möglichkeit, einen Ausdruck zu schreiben, der sich zu einer ganzen Liste erweitert. Angenommen, wir haben eine Liste nums [1, 2, 3, 4], hier ist das Listenverständnis, um eine Liste ihrer Quadrate zu berechnen [1, 4, 9, 16]:

Die Syntax ist [ ausdruck for var in list ] -- the for var in list looks like a regular for-loop, but without the colon (:). Das expr to its left is evaluated once for each element to give the values for the new list. Here is an example with strings, where each string is changed to upper case with '. ' appended:

You can add an if test to the right of the for-loop to narrow the result. The if test is evaluated for each element, including only the elements where the test is true.


Schau das Video: Možnosti rozšíření IBM SPSS Statistics použitím skriptů v Pythonu (Oktober 2021).