Python Adventskalender Tag 21 Artikel. Es tut mir sehr leid, dass ich zu spät komme m (_ _;) m
Heute möchte ich "Python in Practice (PiP)" vorstellen, das ich gerade lese.
Python in der Praxis (PiP) wurde für Pythonista geschrieben, der die Programmierfähigkeit von Python verbessern möchte. Dies ist ein Buch, das geschrieben wurde. Es wurde auch für die "Jolt Jolt Awards: The Best Books" 2014 ausgewählt. Referenz: Welches ist das beste IT-Buch des vergangenen Jahres? Die Ausgabe 2014 "Jolt Awards: The Best Books" wird bekannt gegeben
This book is aimed at Python programmers who want to broaden and deepen their Python knowledge so that they can improve the quality, reliability, speed, maintainability, and usability of their Python programs. Zitat: S.1, l.1
Das Buch behandelt die folgenden vier Themen.
Heute möchte ich das Kapitel "5. Python erweitern" einführen, das sich auf die Verbesserung der Verarbeitungsgeschwindigkeit konzentriert. * Falten Sie den Inhalt bis zum Ende mm
Extending Python Im Kapitel "Python erweitern" werden einige Tipps zur Verbesserung der Python-Verarbeitungsleistung zusammengefasst.
--Verwenden Sie PyPy
boost :: python
verwenden.
Die neuesten Informationen in diesem Bereich finden Sie auch in CFFI (C-Fremdfunktionsschnittstelle für Python).ctypes
auf die C-Bibliothek zuVon hier aus werden wir uns auf die Methode des Zugriffs auf die C-Bibliothek mit ctypes
konzentrieren und die detaillierte Verwendung vorstellen.
Accessing C Libraries with ctypes
Eines der Standardmodule von Python, ctypes
, ermöglicht den Zugriff auf eigenständige gemeinsam genutzte Bibliotheken, die in C oder C ++ geschrieben sind. (Dargestellt durch ".so" unter Linux, ".dylib" unter OS X und ".DLL" unter Windows.)
Mal sehen, wie man das ctype
Modul tatsächlich benutzt.
Hier verwenden wir als Beispiel die Bibliothek hyphen
, die Rechtschreibbindestriche in ein bestimmtes Wort einfügt. (Diese Bibliothek selbst wird von OpenOffice.org und LibreOffice verwendet.)
e.g. input: extraordinary, output: ex-traor-di-nary
Verwenden Sie insbesondere die folgenden Funktionen in der Bibliothek "Bindestrich". (Eine ausführliche Erläuterung der einzelnen Funktionen entfällt.)
hyphen.h
//Erstellen Sie einen HyphenDict-Zeiger aus einer Wörterbuchdatei für die Bindestrichverarbeitung
HyphenDict *hnj_hyphen_load(const char *filename);
//Zur Speicherfreigabe
void hnj_hyphen_free(HyphenDict *hdict);
//Bindestrich verarbeitet Wort gemäß HyphenDict-Zeiger
int hnj_hyphen_hyphenate2(HyphenDict *hdict, const char *word, int word_size, char *hyphens, char *hyphenated_word, char ***rep, int **pos, int **cut);
Lassen Sie uns diese Bibliothek sofort in Python verwenden!
Suchen Sie zunächst den zu verwendenden Bindestrich für die gemeinsam genutzte Bibliothek.
Hyphenate1.py
import ctypes
class Error(Exception):
pass
_libraryName = ctypes.util.find_library("hyphen")
if _libraryName is None:
raise Error("cannot find hyphenation library")
_LibHyphen = ctypes.CDLL(_libraryName)
Es ist so einfach, dass es nicht viel Erklärung braucht, aber die Funktion "ctypes.util.find_library ()" sucht nach einer gemeinsam genutzten Bibliothek und wird von der Funktion "ctypes.CDLL ()" geladen. Erstellen Sie nach dem Laden der Bibliothek Python-Wrapper für die Funktionen in der Bibliothek. Die allgemeine Methode besteht darin, die Funktionen in der Bibliothek Python-Variablen zuzuweisen. Nach dem Zuweisen einer Funktion zu einer Variablen müssen der Argumenttyp und der Rückgabetyp angegeben werden.
B. Beispiel für "hnj_hyphen_load"
Hyphenate1.py
_load = _LibHyphen.hnj_hyphen_load
_load.argtypes = [ctypes.c_char_p]
_load.restype = ctypes.c_void_p
B. Beispiel von "hnj_hyphen_hyphenate2"
Hyphenate1.py
_int_p = ctypes.POINTER(ctypes.c_int)
_char_p_p = ctypes.POINTER(ctypes.c_char_p)
_hyphenate = _LibHyphen.hnj_hyphen_hyphenate2
_hyphenate.argtypes = [
ctypes.c_void_p, # HyphenDict *hdict
ctypes.c_char_p, # const char *word
ctypes.c_int, # int word_size
ctypes.c_char_p, # char *hyphens
ctypes.c_char_p, # char *hyphenaated_word
_char_p_p, # char ***rep
_int_p, # int **pos
_int_p # int **cut
]
_hyphenate.restype = ctypes.c_int
Verwenden wir diese, um eine private Funktion für Python zu erstellen.
Hyphenate1.py
def hyphenate(word, filename, hyphen='-'):
originalWord = word
hdict = _get_hdict(filename)
word = word.encode("utf-8")
word_size = ctypes.c_int(len(word))
hyphens = ctypes.create_string_buffer(word)
hyphenated_word = ctypes.create_string_buffer(len(word) * 2)
rep = _char_p_p(ctypes.c_char_p(None))
pos = _int_p(ctypes.c_int(0))
cut = _int_p(ctypes.c_int(0))
if _hyphenate(hdict, word, word_size, hyphens, hyphenated_word, rep, pos, cut):
raise Error("hyphenation failded for '{}'".format(originalWord))
return hyphenated_word.value.decode("utf-8").replace("=", hyphen)
So was. ctypes.create_string_buffer
ist eine Funktion, die basierend auf der Anzahl der Bytes ein Cchar
erstellt.
Da es notwendig ist, ein Byte an UTF-8 an die Funktion für die Bindestrichverarbeitung zu übergeben, wird die Codierungsverarbeitung durchgeführt.
Die Funktion _get_hdict ()
kann wie folgt geschrieben werden.
Es ist ein einfacher Vorgang zum Laden von Dateien.
Hyphenate1.py
_hdictForFilename = {}
def _get_hdict(filename):
if filename not in _hdictForFilename:
hdict = _load(ctypes.create_string_buffer(filename.encode("utf-8")))
if hdict is None:
raise Error("failed to load '{}'".format(filename))
_hdictForFilename[filename] = hdict
hdict = _hdictForFilename.get(filename)
if hdict is None:
raise Error("failed to load '{}'".format(filename))
return hdict
Sie können die C-Bibliothek von Python aus aufrufen. Wenn Sie die Funktion tatsächlich verwenden, sollten Sie die folgende Ausgabe erhalten.
>>> hyphenate('extraordinary', '/path/to/dictfile')
u'ex-traor-dinary'
Auf diese Weise kann es in Betracht gezogen werden, die Verarbeitung der C-Bibliothek für den Teil zu überlassen, in dem die Verarbeitung unvermeidlich schwer ist, da die C-Bibliothek gelegentlich von Python aus verwendet werden kann.
Dieses Mal habe ich den C-Spracherweiterungsteil von PiP aufgenommen und vorgestellt. PiP ist in sehr einfachem Englisch geschrieben, daher wird es auch für diejenigen empfohlen, die nicht gut Englisch können. Insbesondere das erste Kapitel über Entwurfsmuster ist eine mehrsprachige Grundgeschichte, daher denke ich, dass es viele Geschichten gibt, die für diejenigen hilfreich sind, die andere Sprachen verwenden.
Wir planen zu Beginn des Jahres eine Lesung für dieses Buch bei PyLadies Tokyo. Bitte kontaktieren Sie uns, wenn Sie interessiert sind (Werbung).
Recommended Posts