Pominąłem kilka kroków sugerowanych przez @ nicht-verstehen:
python -m timeit --setup 'import subprocess; p = subprocess.Popen(["ssh", "user@host", "cat"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, bufsize=0)' 'p.stdin.write(b"z"); assert p.stdout.read(1) == b"z"'
Gdzie
python -m timeit
wykonuje timeit
moduł Python.
Ta -s/--setup
opcja informuje, timeit
które instrukcje należy wykonać przed każdym powtórzeniem.
subprocess.Popen(["ssh", "user@host", "cat"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, bufsize=0)
uruchamia się ssh
- uruchamiając cat
na twoim hoście - jako podrzędny / podproces, przekierowując swoje strumienie IO do obiektów podobnych do plików Pythona. bufsize=0
upewnia się, że żadne IO nie jest buforowane, co może powodować, że IO czeka.
I dla każdej pętli:
p.stdin.write(b"z")
zapisuje jeden bajt do dziecka (z kolei przez ssh do cat
).
p.stdout.read(1)
czyta pojedynczy bajt od dziecka. Twierdzenie wokół niego sprawdza, czy ten bajt jest taki sam, jak napisany do niego.
Sprowadza się do tego samego, ale pomija tworzenie nazwanych potoków ( mkfifo
). Zauważyłem, że im więcej uruchomisz pętli, tym szybciej będzie każda pętla. Kontroluj za pomocą -n/--number
:python -m timeit --number 50 ...