Steven Bethard steven.bethard at gmail.com
Mon Dec 20 08:18:29 CET 2004

Adam DePrince wrote:
> file.writelines( seq ) and map( file.write, seq ) are the same; the
> former is syntactic sugar for the later.

Well, that's not exactly true.  For one thing, map(file.write, seq) 
returns a list of Nones, while file.writelines returns only the single 
None that Python functions with no return statement do.  More 
substantially, file.writelines (as far as I can tell from the C code) 
doesn't make any call to file.write.

I looked at fileobject.c and it looks like file.writelines makes a call 
to 'fwrite' for each item in the iterable given.  Your code, if I read 
it right, makes a call to 'writev' for each item in the iterable.

I looked at the fwrite() and writev() docs and read your comments, but I 
still couldn't quite figure out what makes 'writev' more efficient than 
'fwrite' for the same size buffer...  Mind trying to explain it to me again?

> There is one more time that writev would be beneficial ... perhaps you
> want to write a never ending sequence with a minimum of overhead? 
> def camera():
> 	while 1:
> 		yield extract_entropy( grab_frame() )
> open( "/tmp/entropy_daemon_pipe", "w+" ).writev( camera(), 5 ) 

I tried running:

py> def gen():
...     i = 1
...     while True:
...         yield '%i\n' % i
...         i *= 10
py> open('integers.txt', 'w').writelines(gen())

and, while (of course) it runs forever, I don't appear to get any memory 
problems.  I seem to be able to write fairly large integers too:

$ tail -n 1 integers.txt | wc
       1       1    5001

How big do the items in the iterable need to be for writev to be necessary?


P.S.  I certainly don't have anything against including your patch (not 
that my opinion counts for anything) ;) but if it improves a common 
file.writelines usage, I'd like to see it used there too when possible.

More information about the Python-list mailing list