Einführung in Python in der Praxis (PiP)

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.

Was ist Python in der Praxis (PiP)?

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

Von 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.

Zusammenfassung

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

Einführung in Python in der Praxis (PiP)
Einführung in die GUI: PyQt5 in Python
Algorithmus (Segmentbaum) in Python (Übung)
Quadtree in Python --2
CURL in Python
Metaprogrammierung mit Python
Python 3.3 mit Anaconda
Geokodierung in Python
SendKeys in Python
Übung, dies in Python zu verwenden (schlecht)
Metaanalyse in Python
Unittest in Python
Zwietracht in Python
DCI in Python
Quicksort in Python
nCr in Python
N-Gramm in Python
Programmieren mit Python
Plink in Python
Konstante in Python
SQLite in Python
Schritt AIC in Python
LINE-Bot [0] in Python
CSV in Python
Reverse Assembler mit Python
Reflexion in Python
Konstante in Python
Anfänger üben Python
nCr in Python.
Format in Python
Scons in Python 3
Puyopuyo in Python
Python in Virtualenv
PPAP in Python
Quad-Tree in Python
Reflexion in Python
Chemie mit Python
Hashbar in Python
DirectLiNGAM in Python
LiNGAM in Python
In Python reduzieren
In Python flach drücken
Einführung einer Bibliothek, die unter Python / Windows nicht in pip enthalten war
Boost.NumPy Tutorial zum Erweitern von Python in C ++ (Übung)
Klassenvererbungspraxis in Python, wie in sklearn zu sehen
Sortierte Liste in Python
Täglicher AtCoder # 36 mit Python
Clustertext in Python
AtCoder # 2 jeden Tag mit Python
Täglicher AtCoder # 32 in Python
Täglicher AtCoder # 6 in Python
Bearbeiten Sie Schriftarten in Python
Singleton-Muster in Python
Dateioperationen in Python
Lesen Sie DXF mit Python
Täglicher AtCoder # 53 in Python
Tastenanschlag in Python