Ich habe versucht, den Kompromiss zwischen read
und seek
zu verstehen. Bei kleinen "Sprüngen" ist das Lesen nicht benötigter Daten schneller als das Überspringen mit seek
.
Beim Timing verschiedener Lese / Such-Chunk-Größen, um den Kipppunkt zu finden, stieß ich auf ein seltsames Phänomen: read(1)
ist ungefähr 20 mal langsamer als read(2)
, read(3)
usw. Dieser Effekt ist der gleiche für verschiedene Lese-Methoden, z read()
und readinto()
.
Warum ist das der Fall?
Suchen Sie in den Timing-Ergebnissen für die folgende Zeile 2/3 des Weges durch:
%Vor%Umgebung:
%Vor%Timing-Ergebnisse:
%Vor%Benchmarking-Code:
%Vor%Dies liegt daran, dass bei jedem einzelnen Anruf der gesamte Overhead für die Funktion auftritt. Wenn Computer immer noch 8-Bit wären, wäre dieses Phänomen interessanter.
Die Antwort ist einfach: Wenn Sie größere Werte übergeben, verarbeiten Sie mehr Bytes pro Iteration ; wie alle Ihre Besorgungen auf der einen Seite der Stadt, bevor Sie den ganzen Weg zur anderen Seite der Stadt fahren; Je größer der Wert ist, der an read()
weitergegeben wird, desto mehr Botengänge erledigen Sie gleichzeitig und desto effizienter ist es (möglicherweise).
Tags und Links python benchmarking io file