Heim  >  Artikel  >  Backend-Entwicklung  >  Python-Hochleistungsprogrammiermethode eins

Python-Hochleistungsprogrammiermethode eins

高洛峰
高洛峰Original
2016-10-18 10:48:231112Durchsuche

Lesen Sie „Zen of Python“ und geben Sie „import this“ in den Python-Parser ein und denken Sie vielleicht, dass Python nur eine weitere Skriptsprache ist!

Da Es besteht kein Zweifel, dass Python-Programme nicht so effizient und schnell sind wie kompilierte Sprachen. YouTube hat jedoch Python verwendet, um 40 Millionen Videoanfragen pro Stunde zu bedienen Sie müssen lediglich effizienten Code schreiben und bei Bedarf externen Implementierungscode (C/C++) verwenden. Hier sind einige Tipps, die Ihnen helfen, ein besserer Python-Entwickler zu werden:

1. Verwenden Sie integrierte Funktionen Schreiben Sie effizienten Code in Python, aber es ist schwer, die integrierten Funktionen zu übertreffen. 2. Verwenden Sie join(), um Zeichenfolgen zu verketten ist unveränderlich, jede „“-Operation erstellt eine neue Zeichenfolge und kopiert den alten Inhalt. Eine häufige Verwendung besteht darin, das Array-Modul von Python zu verwenden, um nach Abschluss die Funktion „join()“ zu verwenden, um die endgültige Zeichenfolge zu erstellen.

>>> #Dies ist gut, um eine große Anzahl von Zeichenfolgen zusammenzukleben

>>> für chunk in input():

>>> my_string.join( chunk)

3. Verwenden Sie die Python-Mehrfachzuweisung, um Variablen auszutauschen

Dies ist elegant und schnell in Python:

>>> x, y = y, x

Das ist sehr langsam:

>>> temp = x

>>> x = y

>>> y = temp

4. Versuchen Sie es zu verwenden Lokale Variablen

Python ruft lokale Variablen schneller ab als globale Variablen. Vermeiden Sie also das Schlüsselwort „global“.

Versuchen Sie, „in“ zu verwenden.

Schlüsselwort „in“. Einfach und schnell.

>>> für Tastenfolge:

>>> „gefunden“ ausgeben

6 >

Verschieben Sie die „Import“-Deklaration in die Funktion und importieren Sie sie nur bei Bedarf. Wenn Sie also einige Module nicht sofort benötigen, müssen Sie sie beispielsweise nicht zu Beginn verwenden ​​Verbessern Sie den Programmstart durch den Import einer großen Anzahl von Modulen. Sie können jedoch die Ladezeit der Module gleichmäßiger verteilen.

7

Manchmal benötigen Sie eine Endlosschleife in einem Programm (z. B. eine Instanz eines Listening-Sockets), obwohl „while 1“ eine einstufige Operation ist kann Ihre Python-Leistung verbessern.

>>> while 1:

>>> #do stuff, schneller mit while 1

>>> while True:

>>> # Dinge erledigen, langsamer mit wile True

8. Listenverständnis verwenden

Ab Python 2.0 können Sie Listenverständnis verwenden, um viele „für“ und zu ersetzen „while“-Blöcke sind im Allgemeinen schneller, und der Python-Parser kann ein vorhersehbares Muster in einer Schleife erkennen und dafür optimiert werden. Der zusätzliche Vorteil besteht darin, dass ein Listenverständnis in den meisten Fällen besser lesbar ist , Es wird eine zusätzliche Zählvariable gespeichert. Zählen wir zum Beispiel die geraden Zahlen zwischen 1 und 10:

>>> # der gute Weg, einen Bereich zu iterieren

>>> evens = [ i for i in range( 10) if i%2 == 0]

>>> [0, 2, 4, 6, 8]

>>> # Folgendes ist nicht so pythonisch

>>> i = 0

>>> evens = []

>>> while i >>> if i %2 == 0: evens.append(i)

>>> i = 1

>>> [0, 2, 4, 6, 8]

9. Verarbeitung langer Sequenzen:

Dadurch können Sie viel Systemspeicher sparen, da xrange() nur ein ganzzahliges Element pro Aufruf in der Sequenz erzeugt. Im Gegensatz dazu verursacht range(), das Ihnen direkt eine vollständige Liste der Elemente liefert, unnötigen Mehraufwand, wenn es für Schleifen verwendet wird.

10. Verwenden Sie den Python-Generator:

Dies kann auch Speicher sparen und die Leistung verbessern. Beispielsweise können Sie einen Videostream in Byte-Blöcken anstelle des gesamten Streams senden. Zum Beispiel:

>>> chunk = ( 1000 * i for i in xrange(1000))

>>> chunk

>>> chunk.next()

0

>>> chunk.next()

1000

>>> chunk.next( )

2000

11. Verstehen Sie das itertools-Modul:

Dieses Modul ist sehr effektiv für Iteration und Kombination. Lassen Sie uns alle Permutationen einer Liste [1, 2, 3] mit nur drei Zeilen Python-Code generieren:

>>> import itertools

>>> iter = itertools.permutations( [ 1,2,3])

>>> list(iter)

[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), ( 3, 1, 2), (3, 2, 1)]

12. Lernen Sie das Halbierungsmodul, um die Liste sortiert zu halten:

Dies ist eine kostenlose binäre Suchimplementierung und schnelles Einfügen von Werkzeuge für geordnete Sequenzen. Das heißt, Sie können Folgendes verwenden:

>>> import bisect

>>> bisect.insort(list, element)

Sie haben ein Element in die Liste eingefügt. und Sie müssen sort() nicht erneut aufrufen, um den Container sortiert zu halten, da dies in langen Sequenzen sehr teuer sein kann.

13 Verstehen Sie, dass eine Python-Liste tatsächlich ein Array ist:

Die Listenimplementierung in Python ist nicht als gewöhnliche einfach verknüpfte Liste in der Informatik implementiert, über die normalerweise gesprochen wird. Eine Liste in Python ist ein Array. Das heißt, Sie können ein Element einer Liste in der konstanten Zeit O(1) abrufen, ohne eine völlig neue Suche durchführen zu müssen. Was ist der Sinn? Python-Entwickler müssen zweimal darüber nachdenken, wenn sie das Listenobjekt insert() verwenden. Zum Beispiel: >>> list.insert(0, item)

Das Einfügen eines Elements am Anfang der Liste ist nicht effizient, da alle nachfolgenden Elemente In der Liste müssen die Indizes geändert werden. Sie können jedoch list.append() verwenden, um Elemente am Ende der Liste effektiv hinzuzufügen. Verwenden Sie deque zuerst, wenn Sie zwischen den Einfügungen schnell sein möchten. Es ist schnell, da deque in Python als doppelt verknüpfte Liste implementiert ist. Sag nichts mehr.

14. Verwenden Sie dict und set, um Mitglieder zu testen: Überprüfen Sie, ob ein Element in einem dict oder set vorhanden ist. Dies geht in Python sehr schnell. Dies liegt daran, dass dict und set mithilfe von Hash-Tabellen implementiert werden. Die Sucheffizienz kann O(1) erreichen. Wenn Sie daher häufig Mitglieder überprüfen müssen, verwenden Sie set oder dict als Container

>>> mylist = ['a', 'b', 'c'] #Langsamer, überprüfen Sie die Mitgliedschaft mit list:

>>> 'c' in mylist

>>> True

>>> myset = set(['a', 'b', 'c' ] ) # Schneller, überprüfen Sie die Mitgliedschaft mit set:

>>> 'c' in myset:

>>> True

15. Sort() mit Schwartz'scher Transformation :

Die native Funktion list.sort() ist sehr schnell. Python sortiert Listen in natürlicher Reihenfolge. Manchmal müssen Sie in einer nicht natürlichen Reihenfolge sortieren. Sie möchten beispielsweise IP-Adressen nach Serverstandort sortieren. Python unterstützt benutzerdefinierte Vergleiche. Sie können list.sort(CMP()) verwenden, was aufgrund des zusätzlichen Overheads von Funktionsaufrufen langsamer als list.sort() ist. Wenn die Leistung ein Problem darstellt, können Sie die Guttman-Rosler-Transformation anwenden, die auf der Schwartzian-Transformation basiert. Dabei kommt es nur auf den tatsächlich zu verwendenden Algorithmus an, und das kurze Funktionsprinzip besteht darin, dass Sie die Liste transformieren und die von Python erstellten Funktionen aufrufen können. in list.sort() -> Schneller ohne Verwendung von list.sort(CMP()) -> Langsamer.

16. Ergebnisse des Python-Dekorator-Cache:

Das „@“-Symbol ist Pythons Dekorationssyntax. Es dient nicht nur der Nachverfolgung, Sperrung oder Protokollierung. Sie können eine Python-Funktion so dekorieren, dass sie sich das Ergebnis des Aufrufs für die spätere Verwendung merkt. Diese Technik wird Memoisierung genannt. Hier ist ein Beispiel:

>>> from functools import wraps

>>> def memo(f):

>>> Cache = { }

>>> @wraps(f)

>>> def wrap(*arg):

>>> wenn arg nicht im Cache: Cache['arg'] = f( *arg)

>>> Return Cache['arg']

>>> Return Wrap

Wir können auch Dekoratoren für die Fibonacci-Funktion verwenden:

>>> @memo

>>> def fib(i):

>>> if i

>>> return fib( i-1) fib(i-2)

Die Schlüsselidee hier ist: Verbessern Sie die Funktion (Dekoration) und merken Sie sich jeden berechneten Fibonacci-Wert, wenn er sich dort im Cache befindet Eine Berechnung ist nicht mehr erforderlich.

17. Verstehen Sie Pythons GIL (Global Interpreter Lock):

GIL ist notwendig, da die Speicherverwaltung von CPython nicht threadsicher ist. Sie können nicht einfach mehrere Threads erstellen und hoffen, dass Python auf einer Maschine mit mehreren Kernen schneller läuft. Dies liegt daran, dass die GIL verhindert, dass mehrere native Threads gleichzeitig Python-Bytecode ausführen. Mit anderen Worten: Die GIL serialisiert alle Ihre Threads. Sie können Threads jedoch verwenden, um mehrere erzeugte Prozesse zu verwalten und so Programme zu beschleunigen, die unabhängig von Ihrem Python-Code ausgeführt werden.

18. Seien Sie mit dem Python-Quellcode genauso vertraut wie mit der Dokumentation:

Einige Python-Module sind aus Leistungsgründen in C implementiert. Wenn die Leistung entscheidend ist und die offizielle Dokumentation nicht ausreicht, können Sie sich gerne den Quellcode ansehen. Hier finden Sie die zugrunde liegenden Datenstrukturen und Algorithmen. Die Quellcode-Bibliothek von Python ist ein großartiger Ort: http://svn.python.org/view/python/trunk/Modules

Fazit:

Dies ist kein Ersatz für das Nachdenken. Es liegt in der Verantwortung des Entwicklers, die Haube zu öffnen und vollständig zu verstehen, damit er nicht schnell ein Mülldesign zusammenbastelt nicht schnell genug ist, ist externe Hilfe erforderlich: Analysieren und Ausführen von externem Code. Wir werden das im zweiten Teil dieses Artikels behandeln

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn