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.
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
boost :: python
.
Voir aussi CFFI (C Foreign Function Interface for Python) pour les dernières informations dans ce domaine.
--Compiler le code Python en code C en utilisant Cythonctypes
À 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.
libhyphen.so
sous Linux, hyphen.dylib
sous OS X et hyphen.dll
sous Windows où le chemin passe.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.
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