Bekendstelling van fmmap | Friedel Wolff
Spring na die hoofinhoud
Lesings en kongresartikels
Bekendstelling van fmmap
Ook beskikbaar in:
Ek het onlangs kode wat nog rondgelê het, afgestof en nou kan ek fmmap bekendstel. Dit is 'n Python-module wat in die plek van die ingeboude mmap-module gebruik kan word en bied beter werkverrigting. Self het ek spesifiek in 'n vinniger .find()-metode belanggestel. Die "f" in fmmap verwys dalk na "find", "fast", of iemand se naam.
Geheue-afbeelding (Eng. memory mapping) is 'n benadering om lêertoegang soos 'n skikking te laat werk. Daar word nie eksplisiet gelees of geskryf na die lêer nie. Tydens toegang tot hierdie gedeelte van die geheue bestuur die bedryfstelsel die toevoer en afvoer na die onderliggende lêer soos nodig. Dit kan in sommige gevalle lei tot beter werkverrigting.
Toe ek mmap 'n paar jaar gelede in 'n eie program probeer het, het dit met werkverrigting gehelp. Toe sien ek dat die .find()-metode in CPython, alhoewel dit in C geïmplimenteer is, 'n naïewe algoritme gebruik, en ek wou sien of ek werkverrigting verder kon verbeter. Eers het ek probeer om sommige van glibc se algoritmes in 'n Cython-module te implementeer, maar het uiteindelik die beste werkverrigting gekry deur die geoptimeerde funksies in glibc te gebruik. Die hele proses het ook my kennis van die C-funksies vir stringe en geheue verbeter en verfris.
Nou het ek besluit om die kode na 'n eie projek te skuif. 'n Volledige plaasvervanger vir die ingeboude mmap-module het vir my na die beste manier gelyk om hierdie aan ander beskikbaar te stel. Dit bring natuurlik al die voordele en minder aangename oorhoofse koste van projekinfrastruktuur, toetse, kontinue integrasie, en die herontdekking van Python-verpakking in die ewig veranderende omgewing. Omdat ek 'n kindklas van die ingeboude klas maak, het ek gedink ek hoef net die dele van belang te implementeer. In 'n poging om alles goed te doen, kry ek die standaardbiblioteek (CPython) se toetse om my implementasie mee te toets. Die toetse van die PyPy-projek is nie presies dieselfde nie. Dus gooi ek dit sommer ook in die pot. Dit blyk toe 'n goeie idee te wees, omdat dit 'n paar foute uitgewys het wat die standaardbiblioteek nie gewys het nie.
Die toetssuite van die standaardbiblioteek ontwikkel oor tyd, en die huidige weergawe in git is gemik op die komende vrystelling (Python 3.9). In my poging om 'n goeie burger van die Python-wêreld te wees, probeer ek om so veel Python-weergawes as moontlik te ondersteun. Elke Python-weergawe voeg egter toetse by wat weens foutregstellings, funksionaliteit en koppelvlakveranderinge nie werk op vorige weergawes nie. Ek kan dus nie met ouer Python-weergawes (nie eens Python 3.8) op die toetssuite toets sonder moeite nie. Gevolglik word my projek om een funksie aan die wêreld te bied 'n hele projek vir die terugplasing van al die jongste funksionaliteit. Volgens die toetssuite werk dit nou in Python 3.5 – 3.8 en ek sal die een oorblywende probleem op Python 3.4 maklik as deel van 'n verbeterde weergawe van .rfind() regmaak.
Ek het nog nie werkverrigting oordentelik gemeet nie, maar .find() is dalk aansienlik vinniger met fmmap. Die presiese werkverrigting hang aansienlik af van die C-biblioteek. Laat weet hoe goed dit werk!