Présentation de Python en pratique (PiP)

Article du calendrier de l'Avent Python 21. Je suis vraiment désolé d'être en retard m (_ _;) m

Aujourd'hui, je voudrais vous présenter "Python en pratique (PiP)" que je lis actuellement.

Qu'est-ce que Python en pratique (PiP)?

Python in Practice (PiP) est écrit pour Pythonista qui souhaite améliorer la capacité de programmation de Python. C'est un livre qui a été écrit. Il a également été sélectionné pour les "Jolt Jolt Awards: The Best Books" en 2014. Référence: Quel est le meilleur livre informatique de l'année écoulée? "Jolt Awards: The Best Books" édition 2014 annoncée

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. Citation: p.1, l.1

Le livre traite des quatre thèmes suivants.

Aujourd'hui, je voudrais vous présenter le chapitre "5. Extension de Python" qui se concentre sur l'amélioration de la vitesse de traitement. * Pliez le contenu jusqu'à la fin mm

Extending Python Le chapitre Extension de Python résume quelques astuces pour améliorer les performances de traitement Python.

--Utiliser PyPy

À partir de là, nous nous concentrerons sur la méthode d'accès à la bibliothèque C en utilisant ctypes et présenterons l'utilisation détaillée.

Accessing C Libraries with ctypes L'un des modules standard de Python, ctypes, permet d'accéder à des bibliothèques partagées autonomes écrites en C ou C ++. (Représenté par «.so» sous Linux, «.dylib» sous OS X et «.DLL» sous Windows.)

Voyons comment utiliser réellement le module ctype. Ici, à titre d'exemple, nous utiliserons la bibliothèque hyphen qui insère des tirets orthographiques dans un mot donné. (Cette bibliothèque elle-même est utilisée par OpenOffice.org et LibreOffice.) e.g. input: extraordinary, output: ex-traor-di-nary

Plus précisément, utilisez les fonctions suivantes dans la bibliothèque hyphen. (Une explication détaillée de chaque fonction est omise.)

hyphen.h


//Créer un pointeur HyphenDict à partir d'un fichier dictionnaire pour le traitement des tirets
HyphenDict *hnj_hyphen_load(const char *filename);

//Pour la libération de la mémoire
void hnj_hyphen_free(HyphenDict *hdict);

//Traiter le mot de trait d'union selon le pointeur HyphenDict
int hnj_hyphen_hyphenate2(HyphenDict *hdict, const char *word, int word_size, char *hyphens, char *hyphenated_word, char ***rep, int **pos, int **cut);

Utilisons cette bibliothèque en Python tout de suite!

Tout d'abord, recherchez la bibliothèque partagée «trait d'union» à utiliser.

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)

C'est tellement simple que cela n'a pas besoin de beaucoup d'explications, mais la fonction ctypes.util.find_library () recherche une bibliothèque partagée et elle est chargée par la fonction ctypes.CDLL (). Après avoir chargé la bibliothèque, créez des wrappers Python pour les fonctions de la bibliothèque. La méthode générale consiste à affecter les fonctions de la bibliothèque à des variables Python. Après avoir affecté une fonction à une variable, il est nécessaire de spécifier le type d'argument et le type de retour.

Exemple de hnj_hyphen_load

Hyphenate1.py


_load = _LibHyphen.hnj_hyphen_load
_load.argtypes = [ctypes.c_char_p]
_load.restype = ctypes.c_void_p

Exemple de 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

Utilisons-les pour créer une fonction privée pour Python.

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)

Comme ça. ctypes.create_string_buffer est une fonction qui crée Cchar en fonction du nombre d'octets. Puisqu'il est nécessaire de passer un octet à UTF-8 à la fonction pour le traitement des tirets, le traitement de codage est effectué.

La fonction _get_hdict () peut être écrite comme suit. Il s'agit d'un simple processus de chargement de fichiers.

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

Vous êtes prêt à appeler la bibliothèque C depuis Python. Si vous utilisez réellement la fonction, vous devriez obtenir la sortie suivante.

>>> hyphenate('extraordinary', '/path/to/dictfile')
u'ex-traor-dinary'

De cette manière, étant donné que la bibliothèque C peut être utilisée avec désinvolture depuis Python, il peut être possible d'envisager de laisser le traitement à la bibliothèque C pour la partie où le traitement est inévitablement lourd.

Résumé

Cette fois, j'ai repris et présenté la partie extension du langage C de PiP. PiP est écrit en anglais très simple, il est donc recommandé pour ceux qui ne sont pas bons en anglais. En particulier, le premier chapitre sur les modèles de conception est une histoire de base multilingue, donc je pense qu'il y a de nombreuses histoires qui seront utiles à ceux qui utilisent d'autres langues.

Nous prévoyons d'avoir une session de lecture de ce livre à PyLadies Tokyo au début de l'année, donc si vous êtes intéressé, veuillez nous contacter (publicité).

Recommended Posts

Présentation de Python en pratique (PiP)
Présentation de l'interface graphique: PyQt5 en Python
Algorithme (arborescence de segments) en Python (s'entraîner)
Quadtree en Python --2
CURL en Python
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
Pratique d'utilisation de ceci en Python (mauvais)
Méta-analyse en Python
Unittest en Python
Discord en Python
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Programmation avec Python
Plink en Python
Constante en Python
Sqlite en Python
Étape AIC en Python
LINE-Bot [0] en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Constante en Python
Les débutants pratiquent Python
nCr en Python.
format en python
Scons en Python 3
Puyopuyo en python
python dans virtualenv
PPAP en Python
Quad-tree en Python
Réflexion en Python
Chimie avec Python
Hashable en Python
DirectLiNGAM en Python
LiNGAM en Python
Aplatir en Python
Aplatir en python
Présentation d'une bibliothèque qui n'était pas incluse dans pip sur Python / Windows
Tutoriel Boost.NumPy pour l'extension de Python en C ++ (pratique)
Pratique de l'héritage de classe en python comme vu dans sklearn
Liste triée en Python
AtCoder # 36 quotidien avec Python
Texte de cluster en Python
AtCoder # 2 tous les jours avec Python
Daily AtCoder # 32 en Python
Daily AtCoder # 6 en Python
Modifier les polices en Python
Motif singleton en Python
Opérations sur les fichiers en Python
Lire DXF avec python
Daily AtCoder # 53 en Python
Séquence de touches en Python