4 ms·
python3 seems to do much better than either of those for me when using an unbuffered write(1, ...) syscall (plus it prints the correct thing) $ cat yes3.py
by thechewanater 9y ago
python3 seems to do much better than either of those for me when using an unbuffered write(1, ...) syscall (plus it prints the correct thing)
$ cat yes3.py
stdout = open(1, 'wb')
while True:
stdout.write(b'y\n')
$ python3 yes3.py | pv -r > /dev/null
[13.7MiB/s]
$ cat yes2.py
import os
stdout = os.fdopen(1, 'wb')
while True:
stdout.write('y\n')
$ python2 yes2.py | pv -r > /dev/null
[7.77MiB/s]
- glandium 9y agoFor better comparison with my numbers, I ran your scripts on my machine: $ python3 yes3.py | pv -r > /dev/null [18.4MiB/s] $ python2 yes2.py | pv -r > /dev/null [10.2MiB/s] In both cases, a 4KiB buffer is used by python. That's still way slower than the equivalent rust code with a 4KiB buffer (use BufWriter::with_capacity(4096, stdout.lock()) instead of BufWriter::new(stdout.lock())).
- Twirrim 9y agoOut of curiosity: yes2.py: import os stdout = os.fdopen(1, 'wb') while True: stdout.write('y\n') $ python yes2.py | pv -r > /dev/null [9.12MiB/s] $ pypy yes2.py | pv -r > /dev/null [45.5MiB/s] So pypy does a good job of speeding it up. Off a quick 9 second run, python2 with profiling: ncalls tottime percall cumtime percall filename:lineno(function) 1 4.272 4.272 9.301 9.301 yes2.py:1(<module>) 30856080 5.029 0.000 5.029 0.000 {method 'write' of 'file' objects} 1 0.000 0.000 0.000 0.000 {posix.fdopen} 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}